关于“As New Form”的问题
F_DataAccess:设计好的MDI子窗体
其中F_DataAccess窗体中添加了自定义属性:
WindowTitle属性:窗口标题
TableId:表编号属性,映射需要打开的表
模块中的定义:
Public Enum dtTableId
dtProducts = 1
dtEmployees = 2
dtSuppliersAndCustomers = 3
End Enum
MDI窗体中我使用菜单调出窗体
MenuProducts菜单的事件过程:
Dim Products As New F_DataAccess
With Products
.WindowTitle = "产品 "
.TableId = dtTableId.dtProducts
.Show
End With
MenuEmployees菜单的事件过程:
Dim Employees As New F_DataAccess
With Products
.WindowTitle = "职员 "
.TableId = dtTableId.dtEmployees
.Show
End With
思路是正常的,但有一个问题,就是每次点击菜单都会有一个新MDI新窗体启动。有没有办法让MDI窗体在关闭之前再次点击菜单时让已经启动的窗体获得焦点而不再次启动窗体,前提是不重新设计窗体。
如:点击二次菜单“MenuProducts”就会有2个产品窗体被加载,真烦。
[解决办法]
我对VB不是很了解.不过你是不是可以考虑一下..
定义一个全局变量..
当窗口打开时.更改为1
当窗口关闭时.更改为0
在点菜单的时候.判断这个变量是否为0
再做其它操作!
[解决办法]
将Products和Employee声明为模块级变量。
MenuProducts菜单的事件过程:
if Products Is Nothing then
Dim Products As New F_DataAccess
With Products
.WindowTitle = "产品 "
.TableId = dtTableId.dtProducts
.Show
End With
else
Products.SetFocus '忘了form有没有这个方法,如果没有,则调用SetFocusAPI:
'SetFocusAPI Products.hwnd
end if
Employee类似。
[解决办法]
基本上按照楼主最后的那个思路, 把窗体对象变量声明成全局的。
菜单代码上没必要判断Visible是否为真:
Private Products As New F_DataAccess
Private Employees As New F_DataAccess
MenuProducts菜单的事件过程改为:
With Products
.WindowTitle = "产品 "
.TableId = dtTableId.dtProducts
.Show
End With
另外,F_DataAccess的Unload事件中可以加上以下代码:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If UnloadMode = vbFormControlMenu Then
Cancel = True
Me.Hide
End If
End Sub
这样可以避免Products和Employees对象被频繁地Unload和Load
[解决办法]
ding
[解决办法]
关键是楼主根本没有把自己的要求表达清楚,看看我对上面程序的描述:
midi数字音乐编辑软件。
1、使用MDI子窗体,可以打开多个midi文件。比如001.mid,002.mid
2、如果选择的文件已经打开时比如001.mid,直接让已经打开001.mid的MDI子窗体显示在最前端。并且获得焦点,如果此时001.mid已经被修改过,则会提示:“此文件已经打开,并且已经修改,放弃修改重新打开001.mid文件?”,VByes,vbno
3、选择打开其他文件比如003.mid没有什么提示直接在新的子窗体中打开显示并获得焦点。
[解决办法]
Dim Employees As New F_DataAccess
With Products
.WindowTitle = "职员 "
.TableId = dtTableId.dtEmployees
.Show
End With
————————————————————————
把Dim Employees As New F_DataAccess
改为:public Employees As New F_DataAccess放在模块里
菜单事件:
if Employees is nothing then
set Employees =new F_DataAccess
Employees .show
else
Employees .得到焦点 '那个函名记不住名了,嘿
end if
另外在这个窗体关闭时要释放自己,unload me(vb6里行,不知道VBA里是不是这样)