注册 登录
编程论坛 VB6论坛

MDI窗体高度的问题

xiangyue0510 发布于 2015-08-10 15:54, 393 次点击
刚遇到的一个诡异的问题。MDI窗口右侧有一个Picture作为容器,中间是TreeView,下面还有一个StatusBar
由于编程和运行环境不同,我在加载MDI的时候,我根据屏幕修改TreeView的高度,代码如下。

Private Sub MDIForm_Load()
'Load FormBasicInfo
StatusBar1.Panels.Add
StatusBar1.Panels.Add
RefreshStatusBar

Picture1.Width = Screen.Width / 10 * 1.5

LoadTrees
End Sub


Sub LoadTrees()
For i = 1 To 200
 Set Opnode = OperationTree.Nodes.Add(, , , " Test" & i)
Next i
For i = 1 To OperationTree.Nodes.Count
 OperationTree.Nodes(i).Expanded = True
Next i
OperationTree.Appearance = cc3D
OperationTree.LabelEdit = 1
OperationTree.Height = Screen.Height - MDIForm1.ScaleHeight - StatusBar1.Height
OperationTree.Width = Picture1.ScaleWidth
OperationTree.Top = 0
OperationTree.Left = 0
OperationTree.Scroll = True
End Sub

问题出来了,我上次运行之后是正常的,但是现在运行发现下面有一块空白,也就是TreeView高度不够。
只有本站会员才能查看附件,请 登录

更为诡异的是,我家中断点调试的话,结果又是正常的。。。。。我都不知道如何查问题调试了
只有本站会员才能查看附件,请 登录
2 回复
#2
风吹过b2015-08-10 17:04
关键问题在 VB 运行时的 各进程进行的顺序不同。
VB 程序启动,各进程顺序:
1、初始化,Initialize
2、载入:Load
3、大小改变 :Resize

当你在窗口 load 过程中,引用大小等 属性时,引用到的是设计阶段给定的大小数据,因为这时还没有执行 Resize 部分。
当你在 load 过程中,设置断点后,VB会自动在内部执行完 Resize 后再来中断,这里,自己写的代码还在 load 里,Resize 的消息已发出来了,但因为断点的存在,还没及时响应而以。这里 在 load 中取 大小等属性时,就已更新过的大小了。


修改建议,这几句单独放一个响应事件。

Private Sub MDIForm_Resize()
On error resume next
    Picture1.Width = Screen.Width / 10 * 1.5
    OperationTree.Height = Screen.Height - MDIForm1.ScaleHeight - StatusBar1.Height
    OperationTree.Width = Picture1.ScaleWidth
End Sub
#3
xiangyue05102015-08-11 09:17
受教了,我后来估计是顺序或者加载时间的问题,增加了一个Timer,延时调整TreeView。目前已经解决了。
十分感谢
1