VB6 MDI子窗体问题

yiyiyicz 2014-09-25 02:45:00
在《Visual Basic 6 编程技术大全》,“9.1.1 窗体作为对象” 一节中(313页),对窗体有这样的描述
窗体就是具有用户界面的对象
而使用一个对象前,必须对它初始化
可是,在使用窗体时并没有初始化它就使用了

private sub cmdDetails_Click ( )
FrmDetails.Show
end sub
之后,教程中解释了一下原因:当代码调用FrmDetails实体时,不是调用FrmDetails窗体类,而是调用一个名字与该类相同的变量。因为这个变量为自动初始化,只要代码调用该变量,VB就创建那个窗体的新实例。

我的问题是:
考虑上述问题(说实在没太看明白),调用MDI子窗体。MDI子窗体有N个,在界面中只能出现一个子窗体
代码该怎样写,能避免出现上面问题
最好是完整的代码,给出思路和步骤也行
谢谢!
...全文
729 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qxw_csdn 2014-11-30
  • 打赏
  • 举报
回复
学习了,谢谢。
yiyiyicz 2014-10-01
  • 打赏
  • 举报
回复
引用 19 楼 Tiger_Zhao 的回复:
我13楼已经说过了没理解。 不愿解释就算了。
哪里会不愿意解释呢?我担心出现类似2楼那样隐藏的错误 我并非对VB一窍不通,好歹有VBA的基础。但VB范围要比VBA宽多了。目前我正向着“插件”努力,这才发现思维模式还远不是软件编程的思维。
Tiger_Zhao 2014-09-30
  • 打赏
  • 举报
回复
我13楼已经说过了没理解。
不愿解释就算了。
Tiger_Zhao 2014-09-29
  • 打赏
  • 举报
回复
MDI翻译一下就是多文档界面
同时有多个文档(子窗体)很正常的表现啊。

有没有隐患是代码的问题,和MDI有什么关系!
yiyiyicz 2014-09-29
  • 打赏
  • 举报
回复
这样布置窗体,其效果是 左侧有treeview的子窗体,起导航条的作用 点击导航条,出现的窗体是各个任务的工作界面。而任务出现的顺序则是随机的
yiyiyicz 2014-09-29
  • 打赏
  • 举报
回复
一个MDI窗体:MDIfrmG 三个子窗体:Gfrm01 Gfrm02 Gfrm03 Gfrm01始终在MDIfrmG的左侧;Gfrm01中有个treeview控件,当点击treeview中item后,对应的子窗体(Gfrm02 Gfrm03 )弹出并位于MDIfrmG的右侧;子窗体Gfrm02|Gfrm03中数据有关联关系 以下是treeview中的代码

Private Sub Form_Initialize()
Dim NodParent As Node
Dim NodChild As Node
With Me.TreeView1
    .LineStyle = tvwRootLines
    Set NodParent = .Nodes.Add(, , "r", "任务树")
    Set NodChild = .Nodes.Add("r", tvwChild, "child1", "任务列表")
    Set NodChild = .Nodes.Add("r", tvwChild, "child2", "数据库数据")
    Set NodChild = .Nodes.Add("r", tvwChild, "child3", "SE数据")
End With
End Sub
以下是Gfrm01窗体下的代码

Private Sub TreeView1_Click()
Dim Indx As Variant
Dim tepFrm1 As Form, tepFrm2 As Form '注意:窗体变量赋值,防出错!!!!

Indx = TreeView1.SelectedItem.Key
Select Case Indx
    Case "child2"
        Gfrm02.Move MDIFrmG.Width / 3, 0, MDIFrmG.Width * 2 / 3, Me.Height
        Set Gfrm02 = Nothing
    Case "child3"
        Gfrm03.Move MDIFrmG.Width / 3, 0, MDIFrmG.Width * 2 / 3, Me.Height
        Set Gfrm03 = Nothing
End Select
End Sub
这样的结果是,随机反复点击treeview的item,出现的子窗体是对的。但是,所有的子窗体没有关上,而是在后面 关键是,这样的代码,有没有潜藏的隐患?
yiyiyicz 2014-09-29
  • 打赏
  • 举报
回复
引用 12 楼 bcrun 的回复:
[quote=引用 10 楼 yiyiyicz 的回复:] 谢谢版主,有个疑问: set XXXX=nothing 在我的概念里,他的作用是针对对象的操作。释放对象,销毁对象 如是,则去掉 Public FrmDetails As New FrmDetails ,最后的效果也一样
好像是吧,不过如果适当冗余一些代码能让结构更清晰,又何乐而不为呢?[/quote] 我对VB不是很熟,在处理多个MDI子窗体随机被激活,有些概念感觉很模糊。特别是担心“不易察觉的错误”隐藏其中 还是写出不知是对还是错的代码,再请教吧。稍等
Tiger_Zhao 2014-09-29
  • 打赏
  • 举报
回复
我3楼给你解释的是关于“可是,在使用窗体时并没有初始化它就使用了”这个问题。

至于其他的,看不明白你想问什么?
yiyiyicz 2014-09-29
  • 打赏
  • 举报
回复
引用 17 楼 Tiger_Zhao 的回复:
MDI翻译一下就是多文档界面。 同时有多个文档(子窗体)很正常的表现啊。 有没有隐患是代码的问题,和MDI有什么关系!
请仔细、认真读帖 基本问题先要搞清楚!!!!
pipi20091001 2014-09-28
  • 打赏
  • 举报
回复
贴上你的代码!
bcrun 2014-09-28
  • 打赏
  • 举报
回复
引用 10 楼 yiyiyicz 的回复:
谢谢版主,有个疑问: set XXXX=nothing 在我的概念里,他的作用是针对对象的操作。释放对象,销毁对象 如是,则去掉 Public FrmDetails As New FrmDetails ,最后的效果也一样
好像是吧,不过如果适当冗余一些代码能让结构更清晰,又何乐而不为呢?
yiyiyicz 2014-09-27
  • 打赏
  • 举报
回复
引用 9 楼 bcrun 的回复:
[quote=引用 7 楼 yiyiyicz 的回复:] [quote=引用 3 楼 Tiger_Zhao 的回复:] 你就这样理解,VB 自动给所有的窗体都做了类似下面的定义
Public FrmDetails As New FrmDetails
Public MDIForm1 As New MDIForm1
...
能运行 form_terminate 事件,是否可以认为该窗体被释放,并且数据区也释放了?[/quote] 可以啊,而且要想显式地用Set FrmDetails=nothing触发form_terminate 事件,需要先用new操作创建对象: Public FrmDetails As New FrmDetails[/quote] 谢谢版主,有个疑问: set XXXX=nothing 在我的概念里,他的作用是针对对象的操作。释放对象,销毁对象 如是,则去掉 Public FrmDetails As New FrmDetails ,最后的效果也一样
yiyiyicz 2014-09-26
  • 打赏
  • 举报
回复
引用 3 楼 Tiger_Zhao 的回复:
你就这样理解,VB 自动给所有的窗体都做了类似下面的定义
Public FrmDetails As New FrmDetails
Public MDIForm1 As New MDIForm1
...
能运行 form_terminate 事件,是否可以认为该窗体被释放,并且数据区也释放了?
bcrun 2014-09-26
  • 打赏
  • 举报
回复
引用 7 楼 yiyiyicz 的回复:
[quote=引用 3 楼 Tiger_Zhao 的回复:] 你就这样理解,VB 自动给所有的窗体都做了类似下面的定义
Public FrmDetails As New FrmDetails
Public MDIForm1 As New MDIForm1
...
能运行 form_terminate 事件,是否可以认为该窗体被释放,并且数据区也释放了?[/quote] 可以啊,而且要想显式地用Set FrmDetails=nothing触发form_terminate 事件,需要先用new操作创建对象: Public FrmDetails As New FrmDetails
一如既往哈 2014-09-25
  • 打赏
  • 举报
回复
引用 4 楼 yiyiyicz 的回复:
[quote=引用 2 楼 Topc008 的回复:] 如果只需要显示一个窗体,用MDI干什么?再说MDI子窗体和普通窗体的显示和关闭没什么区别。 可以通过forms集合来检查当前工程中已经显示的的所有窗体。
实际上,我在MDI中永远是两个子窗体,并且所有的子窗体之间有关系。为了简单,我只求教每次显示一个子窗体怎么办[/quote] 只有2个子窗体,那就激活一个时(可以最大化),让另一个最小化或隐藏。如果活动窗体最大化或非活动窗体被隐藏了,那么你需要提供一个切换途径
yiyiyicz 2014-09-25
  • 打赏
  • 举报
回复
引用 3 楼 Tiger_Zhao 的回复:
你就这样理解,VB 自动给所有的窗体都做了类似下面的定义
Public FrmDetails As New FrmDetails
Public MDIForm1 As New MDIForm1
...
现在的问题是,“但VB并没有释放和窗体实例相连的数据区” 如何解决没有释放数据的问题 遍历是一种方法,还有没有更好的方法,不用遍历
yiyiyicz 2014-09-25
  • 打赏
  • 举报
回复
引用 2 楼 Topc008 的回复:
如果只需要显示一个窗体,用MDI干什么?再说MDI子窗体和普通窗体的显示和关闭没什么区别。 可以通过forms集合来检查当前工程中已经显示的的所有窗体。
实际上,我在MDI中永远是两个子窗体,并且所有的子窗体之间有关系。为了简单,我只求教每次显示一个子窗体怎么办
Tiger_Zhao 2014-09-25
  • 打赏
  • 举报
回复
你就这样理解,VB 自动给所有的窗体都做了类似下面的定义
Public FrmDetails As New FrmDetails
Public MDIForm1 As New MDIForm1
...
一如既往哈 2014-09-25
  • 打赏
  • 举报
回复
如果只需要显示一个窗体,用MDI干什么?再说MDI子窗体和普通窗体的显示和关闭没什么区别。 可以通过forms集合来检查当前工程中已经显示的的所有窗体。
yiyiyicz 2014-09-25
  • 打赏
  • 举报
回复
上述问题不解决,会产生不易察觉的错误。教程上解释为 当第二次显示窗体时,实际上用的是第一次的实例。此窗体虽被释放,但VB并没有释放和窗体实例相连的数据区。也就是私有和共用变量存放的地方 这个解释我不太明白

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧