找回密码
 立即注册

QQ登录

只需一步,快速开始

chenfeng1029
金牌服务用户   /  发表于:2017-7-4 16:07  /   查看:3217  /  回复:6
整理有个demo.
我吧自己写的一个commandbarlib类放上去,我想把工具栏和右键操作放在一个类中,这样减少前台界面设计
现在遇到一个问题。
我拔这个类封装一个类库。输出dll后。就存在一个问题

bars类库继承commandbarlib,里面有一个AddDlgShortCutKey_MiniBars过程,是在调用窗体时自动加载工具栏和右键
这个过程中有一个段代码: AddHandler MCh.CommandClick, AddressOf P_ComponentHandler,自定义事件。
如果正常窗体程序里调用,好像没啥问题,但是封装到类后,在被外部调用是就会提示“未将对象引用设置到对象的实例”。
类库中调用时,不能直接用窗体引用,只能申明对象调用。后续就会存在问题。
    Public Sub P_ComponentHandler(ByVal sender As Object, ByVal e As CommandClickEventArgs)
        Dim cmdData As String = CType(e.Command.UserData, String)
        dim obj as new form4
        Select Case LCase(cmdData)
            Case "add" '//插入行

            Case "delete" '//删除行

            Case "exit" '//退出

            Case "save" '//保存
                obj .P_OK()
        End Select
    End Sub


不知道该怎么操作,可以解决。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

6 个回复

倒序浏览
JeffryLI
葡萄城公司职员   /  发表于:2017-7-4 17:21:42
沙发
您好,如果封装成动态链接库的话,好像需要注册一下dll,一般在程序里面这样一般都是做成抽象类来完成,仅供本程序使用。具体还需要翻一翻MS的文档。希望能帮到您。
请点击评分,对我5分评价,谢谢!

葡萄城控件服务团队
官方网站: https://www.grapecity.com.cn/developer
回复 使用道具 举报
chenfeng1029
金牌服务用户   /  发表于:2017-7-4 21:38:00
板凳
如果在普通窗体引用里,其实
   Public Sub P_ComponentHandler(ByVal sender As Object, ByVal e As CommandClickEventArgs)
        Dim cmdData As String = CType(e.Command.UserData, String)
        dim obj as new form4
        Select Case LCase(cmdData)
            Case "add" '//插入行

            Case "delete" '//删除行

            Case "exit" '//退出

            Case "save" '//保存
                obj .P_OK()
        End Select
    End Sub
我就直接改写为
   Public Sub P_ComponentHandler(ByVal sender As Object, ByVal e As CommandClickEventArgs)
        Dim cmdData As String = CType(e.Command.UserData, String)

        Select Case LCase(cmdData)
            Case "add" '//插入行

            Case "delete" '//删除行

            Case "exit" '//退出

            Case "save" '//保存
                form4.P_OK()
        End Select
    End Sub
这个在demo里操作没有什么问题 。可以一旦封装在dll。就有问题。
我是通过程序来添加工具栏,最后你们要触发处理事件,这个不知道要在哪里修改下。
回复 使用道具 举报
JeffryLI
葡萄城公司职员   /  发表于:2017-7-5 09:36:56
地板
您好,是这样的,您如果在普通窗体里面是正确,然后在去掉相应的代码然后再打包未执行成功,原因跟VB底层事件处理机制有关系,建议还是使用代码来完成这段功能。
请点击评分,对我5分评价,谢谢!

葡萄城控件服务团队
官方网站: https://www.grapecity.com.cn/developer
回复 使用道具 举报
chenfeng1029
金牌服务用户   /  发表于:2017-7-6 09:22:19
5#
我怕我解释不清楚,我做了一个dll文件。demo2里有调用。你看下。
尤其是dll中,程序加载工具栏后,后续的事件处理,就没法提操作text窗体fg_list。
不知道是哪里问题。或者可以用其他方法解决下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
chenfeng1029
金牌服务用户   /  发表于:2017-7-6 10:10:55
6#
这个问题。我自己测试了下。我吧testdll中的bars类。通过申明public Event P_Saverecord事件。
    Public Sub P_ComponentHandler(ByVal sender As Object, ByVal e As CommandClickEventArgs)
        Dim cmdData As String = CType(e.Command.UserData, String)
        Select Case LCase(cmdData)
            Case "add" '//插入行
                RaiseEvent P_GetRecord()
            Case "delete" '//删除行

            Case "exit" '//退出

            Case "save" '//保存
'                Dim obj As New testdll.text
'                obj.FG_LIST.Rows(1)(1) = "1"
                '                MsgBox(obj.FG_LIST.Rows(1)(1))
                RaiseEvent P_SaveRecord()
        End Select

2个附件我都重新改写了。
我自己要表达的问题,得到解决。就是不知道这个方法是否是最有效的。
是不是还有更好的方法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
JeffryLI
葡萄城公司职员   /  发表于:2017-7-6 10:32:59
7#
chenfeng1029 发表于 2017-7-6 10:10
这个问题。我自己测试了下。我吧testdll中的bars类。通过申明public Event P_Saverecord事件。
    Public ...

您比我处理的快啊,我还在看您的代码,我再看看,看有什么好的解决办法,有我会通知您。祝您工作愉快。
请点击评分,对我5分评价,谢谢!

葡萄城控件服务团队
官方网站: https://www.grapecity.com.cn/developer
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部