以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助] 批量设置功能区的状态按钮,怎么老是报错呢?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=134112)

--  作者:龙潭春早
--  发布时间:2019/4/27 19:13:00
--  [求助] 批量设置功能区的状态按钮,怎么老是报错呢?
想在主菜单的全局事件Click中,统一设置一下功能区A的一批状态按钮。

感觉没有错误,但是下面的代码怎么老是报错呢?

怎么改呢?

For Each g As RibbonMenu.Group In RibbonTabs("功能区A").Groups
    For Each itm As object In g.items
        If Typeof itm Is RibbonMenu.Togglebutton Then            
            If itm = e.Sender Then
                MainTable = Tables(itm.Name)                
                Dim tl As Table = Tables(itm.Name)
                For Each cl As Col In tl.Cols
                    cl.Visible = True
                Next                
                Tables(itm.Name).filter = ""
            End If
        End If
    Next
Next

显示这个,要怎么为类型定义运算符 “=” 呢?

图片点击可在新窗口打开查看此主题相关图片如下:状态按钮,批量设置出错 2019.04.27.png
图片点击可在新窗口打开查看


--  作者:有点甜
--  发布时间:2019/4/28 10:15:00
--  
If itm.name = e.Sender.name Then
--  作者:龙潭春早
--  发布时间:2019/4/28 14:24:00
--  
嗯 问题解决了。

不过,甜老师,感觉 If itm = e.Sender Then 在语法上也对吧?

定义 itm 为当前触发事件的组件 e.Sender,怎么会出错呢?

--  作者:有点甜
--  发布时间:2019/4/28 14:48:00
--  

 

两个对象之间,无法直接比较。只能比较它们的某些属性。

 

 


--  作者:龙潭春早
--  发布时间:2019/4/28 16:44:00
--  
哦 谢谢啦!
--  作者:龙潭春早
--  发布时间:2019/4/30 19:38:00
--  
【问题】
下面这段代码中,定义tb为功能区类型,并且遍历了功能区。

在Select Case e.tb.Name中,用 e.tb.Name 表示当前的功能区。

但是,在代码编辑器确认的时候,出现下面的问题。

为什么呢?     怎么解决呢?

图片点击可在新窗口打开查看此主题相关图片如下:定义的功能区tb不被接受.png
图片点击可在新窗口打开查看

【代码】
For Each tb As Ribbonmenu.Tab In RibbonTabs
    For Each g As RibbonMenu.Group In tb.Groups
        For Each itm As object In g.items
            Select Case e.tb.Name
                Case "功能区A"                    
                    If g.Name = tb.Groups("功能组A").Name Then
                         If itm.Name = e.Sender.Name Then
                              Forms("窗口1").open()
                              Forms("窗口1").text = "产品分类: " & e.Sender.Text \' 窗口个性化 !
                         End If
                    End If

                Case "功能区B", "功能区C"
                    MainTable = Tables(e.Sender.name)                    
                    For Each cl As Col In Tables(e.Sender.name).Cols
                        cl.Visible = True
                    Next
                    Tables(e.Sender.Name).filter = ""

            End Select            
        Next
    Next
Next

--  作者:有点蓝
--  发布时间:2019/4/30 20:20:00
--  
Select Case tb.Name
--  作者:龙潭春早
--  发布时间:2019/4/30 22:54:00
--  
之前就是按照 Select Case tb.Name 这么用的。

但是这段代码,放到主菜单的全局事件Click中之后,会出现混乱。

点击任何菜单按钮,都会执行打开以该按钮名称为表名的表,

相当于执行了 MainTable = Tables(e.Sender.Name)

比如,6楼 的 Case "功能区A" 下的那段代码,应该是只打开 “窗口1”

但是,打开窗口1后,还会同时执行 MainTable = Tables(e.Sender.Name),打开相应的表。

单击任何一个按钮,比如 “切换” 按钮,出现这个:

图片点击可在新窗口打开查看此主题相关图片如下:菜单上的按钮发生混乱-1.png
图片点击可在新窗口打开查看


每次点击确定后,都再次出现一次该截屏的内容,第二次点击确定后,出现:


图片点击可在新窗口打开查看此主题相关图片如下:菜单上的按钮发生混乱-2.png
图片点击可在新窗口打开查看


就是因为出现了上面的这些问题, 才想到是不是要用当前功能区 e.tb.Name,来强化界定 Case 的限制功能。

但是,为什么会出现这样的问题呢?

怎么解决呢?




[此贴子已经被作者于2019/4/30 22:59:09编辑过]

--  作者:有点蓝
--  发布时间:2019/4/30 23:07:00
--  
For Each tb As Ribbonmenu.Tab In RibbonTabs
    Select Case tb.Name
        Case "功能区A"
            For Each g As RibbonMenu.Group In tb.Groups
                If g.Name = "功能组A" Then
                    For Each itm As object In g.items
                        
                        If itm.Name = e.Sender.Name Then
                            Forms("窗口1").open()
                            Forms("窗口1").text = "产品分类: " & e.Sender.Text \' 窗口个性化 !
                        End If  
                    Next
                End If
            Next

    End Select
Next


--  作者:龙潭春早
--  发布时间:2019/4/30 23:24:00
--  
嗯 之前也是这么单独设置的功能区代码。

后来要处理的功能区多了,都要对其中的按钮进行批量的设置,而按钮的处理方法也不一样。

所以,想用 6楼 的方法合成设置:

先统一遍历所有的功能区、功能组和项目,再用 Select Case 分别设置各个功能区。

这样能够节省每个功能区单独的遍历操作,减少代码和工作量。

唉,看样子是做不到了!