标题:关于树形菜单,如何简化菜单代码,在数据表中进行菜单设置,点击节点打开相 ...
只看楼主
wlbwxd
Rank: 2
等 级:论坛游民
威 望:1
帖 子:6
专家分:10
注 册:2021-8-9
结帖率:100%
已结贴  问题点数:20 回复次数:5 
关于树形菜单,如何简化菜单代码,在数据表中进行菜单设置,点击节点打开相应的窗体?
Dim frm As Form
For Each frm In Forms
If frm.Name = "Form1"   Then  
   frm.show
End If
Next
但上面的代码没法实现,“For Each frm In Forms”这句代码查资料是说只能在加载的窗体中查找,请问版主怎么实现?
搜索更多相关主题的帖子: 数据表 代码 窗体 菜单 树形 
2021-12-15 12:48
hmj0745
Rank: 2
等 级:论坛游民
帖 子:52
专家分:83
注 册:2021-11-6
得分:10 
我前天说的哪个思路,如果把菜单节点名称设置成和窗体名称一致,我刚试了一下,是可以直接打开的,给你参考下。
Private Sub CDTree_NodeClick(ByVal Node As MSComctlLib.Node)
 Dim FrmName As String, TmpForm As Form
 FrmName = Node.Text '//把节点名称赋值给FrmName
 Set TmpForm = Forms.Add(FrmName)
 TmpForm.Show 0
end sub

不去做永远没有结果!
2021-12-15 16:41
wlbwxd
Rank: 2
等 级:论坛游民
威 望:1
帖 子:6
专家分:10
注 册:2021-8-9
得分:0 
回复 2楼 hmj0745
非常感谢hmj0745的支持!
我测试了一下OK,达到预期效果。
另外,节点名称赋值给FrmName ,这里改了一下,使用Key作为FrmName,因为程序中窗体是英文名,与节点Node.Text不一致
修改后源码如下:
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
    On Error GoTo 111
    Dim FrmName As String, TmpForm As Form
    TreeView1.SingleSel = True
    FrmName = Node.Key '//把节点名称赋值给FrmName
    Set TmpForm = Forms.Add(FrmName)
    TmpForm.Show 0
111:
    Exit Sub
End Sub
2021-12-15 19:58
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:10 
我也想也一个思路,写了一个示例,使用 listbox 来展示的,其它差不多原理。

其实窗体不应该使用 name 或 Caption ,这二个是有可能有重命的 ,而应该使用 hwnd 来标识每一个窗体。

窗体清单.rar (2.44 KB)


授人于鱼,不如授人于渔
早已停用QQ了
2021-12-15 20:07
hmj0745
Rank: 2
等 级:论坛游民
帖 子:52
专家分:83
注 册:2021-11-6
得分:0 
回复 4楼 风吹过b
的确,句柄的唯一性,更精准。
我看风版这个示例来做一个产品图纸查看器,很不错。
把子窗体和MDI窗体的缩放同步做一致,或是再增加一个并列对比模式。
x,y 方向加上滚动条,按下鼠标移动时,让滚动条的value 值相应变化。可以产生移动图纸效果。
如果滚轮能给局部放大,像CAD里一样,就更好了。 这个后面要试一下。

不去做永远没有结果!
2021-12-15 20:43
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
后面想到了,不用这么麻烦针对窗体上每个控件都写一行代码,可以用定时器来扫描窗体情况。
这种的法,子窗体不需要添加任何代码,每次窗体发生变化后,定时扫描窗体情况,然后进行添加、减少,修改活动窗体。

在 mdi窗体上,放一个定时器,Interval 属性设 100 ,感觉差不多了。
list2的 Style  要设为 1-VbListBoxCheckbox 或者 MultiSelect 属性设 1 或 2 。

代码
程序代码:
Private Sub Timer1_Timer()
Static AFhWnd As Long     '上一次扫描时活动窗体 hWnd
Static FrmCount As Long   '上一次扫描时总窗体数
Dim frm As Form, i As Long

If Forms.Count > 1 Then         '如果当前窗体数量>1
    '如果保存的活动窗体没有发生变化 并且总窗体数也没变化时不处理
    If Me.ActiveForm.hWnd = AFhWnd And FrmCount = Forms.Count Then Exit Sub
Else
    Exit Sub
End If
FrmCount = Forms.Count

Debug.Print AFhWnd, FrmCount


'清list2中的选择
    For i = 0 To List2.ListCount - 1
        List2.Selected(i) = False
    Next i

'遍类所有的窗体
For Each frm In Forms
    If Not frm Is Me Then           '不是mdi窗体,本过程是写在 MDI窗体代码中
        For i = 0 To List2.ListCount - 1
            If List2.List(i) = frm.hWnd Then
                List2.Selected(i) = True
                Exit For
            End If
        Next i
        
        '未找到,则添加
        If i > List2.ListCount - 1 Then
            List1.AddItem frm.Caption
            List2.AddItem frm.hWnd
            List2.Selected(i) = True
        End If
    End If
    If frm Is Me.ActiveForm Then
        GotFocusYN = True
        List1.ListIndex = i
        AFhWnd = frm.hWnd
        GotFocusYN = False
    End If
Next

'清已经关闭的窗体记录
    For i = List2.ListCount - 1 To 0 Step -1
        If Not List2.Selected(i) Then
            List1.RemoveItem i
            List2.RemoveItem i
        End If
    Next i

End Sub


授人于鱼,不如授人于渔
早已停用QQ了
2021-12-16 19:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-507879-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053727 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved