比如:我想给每个新建的Form加上如下代码Private Sub Form_Click()
Debug.Print "Click"
End Sub请注意:以上代码不是静态添加在源码里!!!而是指,当程序运行时,某一个窗体被载入时,动态加上的,
且不影响该窗体本身的事件处理。一般来说,可以使用
Private WithEvents Form1 As Form
的办法,但问题是,不知道何时、如何捕捉,新窗体被载入事件?基本上,就像如何感应 Forms 集合添加了一个窗体?(最好能不用VB杀手——子类)
Debug.Print "Click"
End Sub请注意:以上代码不是静态添加在源码里!!!而是指,当程序运行时,某一个窗体被载入时,动态加上的,
且不影响该窗体本身的事件处理。一般来说,可以使用
Private WithEvents Form1 As Form
的办法,但问题是,不知道何时、如何捕捉,新窗体被载入事件?基本上,就像如何感应 Forms 集合添加了一个窗体?(最好能不用VB杀手——子类)
你这相当于让一个运行的exe重新编译自己。
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_CREATE = &H1Public Function hjj(ByVal hnd As Long, ByVal Msg As Long, ByVal wp As Long, ByVal lp As Long) As Long
If Msg = WM_CREATE Then Debug.Print "haha"
hjj = CallWindowProc(hhh, hnd, Msg, wp, lp)
End Function窗口
Option Explicit
Private Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GCL_WNDPROC = (-24)Private Sub Command1_Click()
Load Form2
Form2.Show
Load Form3
Form3.Show
End SubPrivate Sub Form_Load()
hhh = SetClassLong(Me.hWnd, GCL_WNDPROC, AddressOf hjj)
End SubPrivate Sub Form_Unload(Cancel As Integer)
Call SetClassLong(Me.hWnd, GCL_WNDPROC, hhh)
End Sub
在整个工程中到时——就知道什么叫VB杀手了,
不要告诉我你没保存代码噢,呵呵:)另外,你这样就需要更改每个窗体的静态代码,
那那还不如直接把代码复制到窗体中呢^-^相比较而言,觉得WithEvents更合适点,
只差不知如何感应Forms集合的变化
而且,我是想给每个新增窗体的某个事件添加一些代码
而且,我是想给每个新增窗体的某个事件添加一些代码
你可以放到sub main去.
这本来就是给每个新增的窗口的某个事件都添加代码啊.
并且,每个窗体都可自由的载入、卸载、隐藏、显示 或模式显示。
并不影响其它窗体的该消息处理那具体怎么做呢?
我只中断了下,在立即窗口中 Unload Form2
结果。
幸好,偶保存了代码:)现在,怎么解决卸载Form1后,如何继续的问题呢?
如果你其他窗体都是直接或者间接通过form1启动的
那么form1就是主窗体frmmain。 主窗体总是存在的
他的unload表示进程的退出, 需要释放所有的资源。不知道你怎么要好好的去unload form1? 你设计一定有问题。
一般不需要显示界面!!!只在需要时,载入并显示相应窗体!
所以,根本没有什么主窗体之说,
我想要的结果也就是对所有载入的窗体增加代码,
详见标题,就是这么设计的,呵呵:)
(主要目的就是不更改窗体源码,就可增加功能,而且可以应用到所有VB Load的窗体上)
Debug.Print "Haha,你也不会:)"
End Sub
如何在不改变原窗体源码的情况下,
在运行的任何时候,能感应到VB.Forms集合有所变动?这一问题不能解决,其它的都免谈。
pigsanddogs(我爱吃猪肉,但是长不胖,为什么??)
兄弟的办法虽然不错,但也还是要保留一个隐含窗体,
这个窗体就是一个特例!
要是这个窗体被其它窗体中的代码不小心卸载了,那本主题是想找一个通用的办法,不受特定窗体限制的。
起因是因为,每次都要在每个窗体中增加相同的功能,
但有时候又不需要加,而且那是API调用,还要回到顶部声明
觉得烦了。
(不放在模块里是为了和模块里的全局API声明有所区别——参数定义不同)
而有一些窗体是公用窗体,其它工程里会用到,
那时也许需要,也许又不需要这些代码,又要注释掉——麻烦,
(虽然有#If功能,但那不是根本的解决办法,毕竟没有运行时动态的灵活)
最好的办法,就是在本工程里,只在运行时,
才为需要的窗体加上功能,这样能做到最好的兼容、封装:)所以,第一步是能感应VB.Forms集合的变化!
第二步是能取得新窗体的对象实体,
能把它绑定到WithEvents As Form 事件对象上?
这样就能以VB的方式自由的编写任何功能了。
能把它绑定到WithEvents As Form 事件对象上?