设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1980|回复: 4
打印 上一主题 下一主题

[Access本身] "1微秒"解决大问题——我与超链接的斗争

[复制链接]
跳转到指定楼层
1#
发表于 2011-7-19 23:26:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
"1微秒"解决大问题
        ——我与超链接的斗争
写的这篇东西可能价值不大,但如果有人不幸也同样碰到了我的遭遇,而他又有幸看到了这篇东西,那也算不幸中的万幸了.

事情的开始是这样的:
我想在"窗体1"中实现标签的单击打开"窗体2",这个不是问题,但我想让鼠标移到标签上时,鼠标指针变成手状,移走时,鼠标指针复原.按说能实现这个效果的方法有几个.
1.用API函数
2.引用外部保存好的指针文针
3.用超链接
我觉得前两种都相对比较麻烦,所以,我选择的第3种,第3种是ACC自动实现的,多方便啊!呵呵~~没想到,这条路却让我陷入了一片沼泽,够我挣扎一大通的了.
需要说明的是,我运用超链接,并不是把窗体2直接挂到标签的超链接子地址上,而是由于程序全局的需要,把一个公共过程(MyRun("Str")挂到标签的"单击"事件上.经Grant点拨,在标签的超链接地址上填入一个空格即能实现"伪"超链接效果.一试,果不其实,好爽,没想到这么容易就实现了.但是...

接下来麻烦也就跟着来了:
我每次程序起动,去点那个标签,弹出窗体后,总会有一个"Web"工具栏跟着弹出,当Web工具栏弹出后,手工把它关闭后,再次单击标签,它就不会出现了,但当退出程序后,再次启动程序后单击标签,它依然会弹出.烦!!!
这个工具栏对我来说是无一点用途的,当然要把它屏敝掉.如何屏敝它呢?
我首先想到的就是在MyRun过程中首先运行CommandBars("Web").Visible = False,一测试,竟无效.于是,我试图到自定义对话框中把它删除掉算了,反正这个工具栏也几乎无用途,到那一看,傻眼了,这是系统工具栏,不允许删除.
NND!问题出在哪呢?是不是这个超链接有什么玄机,在我的MyRun过程后运行了呢?我开始这么考虑了(后来证明,此玄机确实存在,陈格也是这么解释的,所有问题都是它在作怪),于是,我把CommandBars("Web").Visible = False放在我的MyRun过程最后试试,依然不行.把这句命令移到我的程序启动代码中,还是不起作用.呵呵,这烦恼开始大发了.最后,还是Grant帮我解决了这个问题.竟然是CommandBars("Web").Enabled = False有效,呵呵,竟想不到啊.
事情解决了?等等...新的问题接着又来了.
我打开的"窗体2"是一个对话框形式的窗体(模式:是;弹出:是),但打开后,它竟没有获得焦点,但焦点在哪呢?我不知道,也想不通它不获得焦点,还能有谁获得了那个焦点,总之,弹出的"窗体2"是没有自动获得焦点.
后来,Victor_Duane发现了一个小巧门,就是在打开"窗体2"的命令行上,带上一个acDialog参数,问题就可以解决了.一测试,果然,看来这个参数专克这个问题了,哈哈...高兴啊!没有解决不了的问题!
在后面的操作中,这个acDialog又给我带来了新的问题(唉...问题没完没了了).
我的原设计"窗体2"是一个无边框的窗体,但这个acDialog参数与无边框也是有冲突的,也就是说,带了这个参数,打开的窗体全部都自动带上了标题与边框.这可是个不小的难题了,一方面,要让"窗体2"能自动获得焦点,就必须带上这个参数,另一方面,带上这个参数,"窗体2"就会带上边框.真是冲突碰上冲突了.
我想啊想,就是想不到一个很好的解决方案.
后来,我又把这问题扔给Grant了,要么说Grant厉害呢!他竟能想出一个超简单的解决方案:在打开"窗体2"的命令行上不要带acDialog参数,在"窗本2"的模块里写代码如下:
Private Sub Form_Timer()
    Me.SetFocus
    Me.TimerInterval = 0
End Sub
把"窗体2"的计时器间隔设为1(没想到,这1微妙竟能帮大忙了),就这样,问题又解决了.

后序:
我又测试了更多的东东,就算我对"窗体2"并不要求无边框,而不用Timer事件,让"窗体2"自己获得焦点,转而用acDialog参数,那么,如果我从"窗体2"再放一个按钮,关闭"窗体2",打开"窗体3"(也同样是模式:是;弹出:是),代码如下:
Private Sub Command1_Click()
    DoCmd.Close acForm, Me.Name
    DoCmd.OpenForm "窗体3"
End Sub
这样的效果是:"窗体3"也同样没有获得焦点.虽然它也是对话框式的窗体,除非,在打开"窗体3"的命令上也带上acDialog参数.由此可见,那个超链接的玄机依然又发挥了它的魔力,只不过,一直是acDialog参数在压着它,一旦它瞅准机会,还是会爆发的,用刘天王的话说:"你知不知道,我一直压着火呢",哈哈...至于它到底是什么玄机,不得而知.

总结:
1.要禁掉Web工具栏,提前使用CommandBars("Web").Enabled = False
2.要打开对话框式的窗体,如果它不再关闭自已打开另一个类似窗体,可采用acDialog参数
3.如果要打开无边框的对话框窗体,最好是用对话框窗体的"计时器确发"事件来自己获得焦点.1微秒,解决大问题
好了,描述得相当啰嗦,希望有人能从中得以解惑.

特别鸣谢:
Grant;Victor_Duane;陈格
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享分享 分享淘帖 订阅订阅
2#
发表于 2011-7-20 11:30:14 | 只看该作者
谢谢分享!!
3#
发表于 2011-7-22 23:48:03 | 只看该作者
本帖最后由 weikitwong 于 2011-7-22 23:50 编辑

1.在超连接打一个空格 便有手形   2.鼠标单击动作  3.隐藏web工具 最好建一个宏 ,鼠标按下动作
4#
发表于 2011-7-23 00:29:31 | 只看该作者
本帖最后由 红尘如烟 于 2011-7-23 00:32 编辑

老猫最近是不是最近被人当成病猫了?突然开始发威了
这个问题我以前也遇到过,用超链接属性的话,用着简单是简单,但总结起来存在下面几个问题:
1. 光标移上去之后,会显示一个空的控件提示(浅黄色的那个),看着不爽,没有解决办法。
2. 会自动打开Web工具栏,很烦人,解决办法就是CommandBars("Web").Enabled = False禁用它。
3. 打开的弹出窗体得不到焦点,原因是点击超链接之后,会自动打开Web工具栏,并将焦点移到Web工具栏中的一个输入框里面,而就算禁用了Web工具栏,这个焦点移动还是会发生,虽然Web工具栏被禁用了,但是由于工具栏属于Access主窗口中的一部分,所以焦点会移到Access主窗口,因此如果不是弹出窗体就没有这种情况。就算像老猫那样用计时器事件,但是如果用的多了还得在很多地方加代码,还是很麻烦。
所以权衡之下,我现在一直用API来实现了,代码如下,直接设置一下“鼠标移动”事件属性就行:=SetCursor()
  1. Private Declare Function apiSetCursor Lib "user32" Alias "SetCursor" (ByVal hCursor As Long) As Long
  2. Private Declare Function apiLoadCursorByNum Lib "user32" Alias "LoadCursorA" (ByVal hInstance As Long, ByVal lpCursorName As Long) As Long

  3. '光标形状常量枚举
  4. Public Enum cuCursorType
  5.     cuCursorHand = 32649            '手形
  6.     cuCursorAppStarting = 32650     '系统忙
  7.     cuCursorArrow = 32512           '常规箭头形
  8.     cuCursorCross = 32515           '十字形
  9.     cuCursorIbeam = 32513           '文本插入
  10.     cuCursorIcon = 32641            '使用指定光标
  11.     cuCursorNo = 32648              '不可用
  12.     cuCursorSize = 32640            '隐藏指针
  13.     cuCursorSizeAll = 32646         '选中并移动
  14.     cuCursorSizeNESW = 32643        '左下角右上角大小调整
  15.     cuCursorSizeNS = 32645          '上下调整
  16.     cuCursorSizeNWSE = 32642        '左上角右下角大小调整
  17.     cuCursorSizeWE = 32644          '左右调整
  18.     cuCursorUpArrow = 32516         '上箭头
  19.     cuCursorWait = 32514            '沙漏
  20. End Enum

  21. '将光标设为指定形状,默认为手形,在对象的鼠标移动事件中调用
  22. Public Function SetCursor(Optional CursorType As cuCursorType = cuCursorHand)
  23.     Call apiSetCursor(apiLoadCursorByNum(0, CursorType))
  24. End Function
复制代码
5#
发表于 2011-7-23 09:39:40 | 只看该作者
老猫开始发威了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-29 04:43 , Processed in 0.093088 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表