|
"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;陈格 |
|