关于扫描控件在不同的操作系统中有不同的版本,我现在程序目录下有没同的版本的ocx文件(win98/win200/winxp),可不可以项目工程-部件中不引用imgscan和imgedit,但form上可以自动根据操作系统(win98/win200/winxp)来分别调用这些ocx

解决方案 »

  1.   

    可以,先获得操作系统的类型(这一步没有问题吧),然后根据操作系统的不同,在窗体上动态加载ocx控件,参考:http://dev.csdn.net/develop/article/6/6599.shtm
      

  2.   

    嘿嘿,楼上已经说了,我就再捞点~~~
    在VB中动态添加可响应消息的控件
        在VB编程中,经常要根据不同的情况在运行时向窗口中添加或者删除控件,而各个控件还要
    响应各种事件。在一般的情况下是首先在设计时将控件加入到窗口中,在它们的各个事件中写入
    代码,然后将它们的Visible属性设置为False。在运行时再使控件显示出来,但是这样既不方便
    同时也因为在设计时在窗口中加入太多的控件而使得程序的运行速度变慢。下面我向大家介绍一
    种通过编程在运行时动态添加和删除控件的方法
        首先建立一个工程文件,然后在Form1中加入以下的代码:
        Dim WithEvents cmdMyCommand As VB.CommandButton
        Option Explicit
        '在下面的定义中,程序定义了一个TextBox控件、一个CommandButton控件
        '和一个附加控件。
        Dim WithEvents ctlDynamic As VBControlExtender
        Dim WithEvents ctlText As VB.TextBox
        Dim WithEvents ctlCommand As VB.CommandButton
        Dim WithEvents ctlCommandDel As VB.CommandButton
        Private Sub ctlCommandDel_Click()
            Dim i As Integer
            
            '将控件的许可证信息删除
            Licenses.Remove "MSComctlLib.TreeCtrl"
            If MsgBox("是否删除所有控件", vbYesNo) = vbYes Then
            For i = 1 To Form1.Controls.Count
                Controls.Remove 0
            Next i
            End If
        End Sub
        Private Sub ctlCommand_Click()
            ctlText.Text = "你点击的是控制按钮"
        End Sub    Private Sub ctlDynamic_ObjectEvent(Info As EventInfo)
            '当点击树形控件的某一个条目后,在ctlText中显示条目。
            If Info.Name = "Click" Then
                ctlText.Text = "你点击的条目是 " & _
                        ctlDynamic.object.selecteditem.Text
            End If
        End Sub    Private Sub Form_Load()
            Dim i As Integer
            ' 将树形控件的许可证信息加入到许可证集合中
            ' 如果许可证已经存在,则会返回错误信息732
            Licenses.Add "MSComctlLib.TreeCtrl"        ' 在Form中动态的加入一个树形控件,如果你想树形控件建立到不同的
            '容器中,象一个Frame控件或者PictureBox控件,你只要将Controls.Add
            '函数的第三个参数改为特定的容器名就可以了
            Set ctlDynamic = Controls.Add("MSComctlLib.TreeCtrl", _
                            "myctl", Form1)
            '设置树形控件的位置和尺寸
            ctlDynamic.Move 1, 1, 2500, 3500
            '在树形控件中加入10个节点
            For i = 1 To 10
                ctlDynamic.object.nodes.Add Key:="Test" & Str(i), _
                        Text:="Test" & Str(i)
                ctlDynamic.object.nodes.Add Relative:="Test" & Str(i), _
                        Relationship:=4, Text:="TestChild" & Str(i)
            Next i
            '使树形控件可见
            ctlDynamic.Visible = True        '加入一个TextBox
            Set ctlText = Controls.Add("VB.TextBox", "ctlText1", Form1)
            '设置TextBox的位置和尺寸
            ctlText.Move (ctlDynamic.Left + ctlDynamic.Width + 50), _
                            1, 2500, 100
            '将textBox的背景色设置为蓝色并将前景色设置为白色
            ctlText.BackColor = vbBlue
            ctlText.ForeColor = vbWhite
            '使TextBox可见
            ctlText.Visible = True        '加入一个CommandButton
            Set ctlCommand = Controls.Add("VB.CommandButton", _
                            "ctlCommand1", Form1)
            '设置CommandButton的位置和尺寸
            ctlCommand.Move (ctlDynamic.Left + ctlDynamic.Width + 50), _
                            ctlText.Height + 50, 1500, 500
            '设置CommandButton的标题
            ctlCommand.Caption = "点击"
            '使CommandButton可见
            ctlCommand.Visible = True
            
            '建立一个删除按钮
            Set ctlCommandDel = Controls.Add("VB.CommandButton", _
                            "ctlCommand2", Form1)
            ctlCommandDel.Move (ctlDynamic.Left + ctlDynamic.Width + 50), _
                            ctlText.Height + 650, 1500, 500
            ctlCommandDel.Caption = "删除所有控件"
            ctlCommandDel.Visible = True
        End Sub
        运行上面的程序,可以看到程序在窗口中加入了三个VB标准控件:一个TextBox和两个
    CommandButton还加入了一个扩展的ActiveX控件:树形控件。这些控件还可以响应消息,
    点击树形控件中的项目或者“点击”按钮就可以在文本框中显示相应的内容。点击“删除
    所有控件”按钮就可以删除加入的所有控件了。
        通过上面的程序可以看到,通过WithEvents可以定义带事件相应的控件,对于标准的VB
    控件(例如CommandButton、TextBox等)可以通过VB.XXX来定义,其中XXX是控件的类的名称
    ,而对于扩展的ActiveX控件,可以通过VBControlExtender来定义,在装载扩展控件以前,
    首先要使用Licenses对象加入控件的许可证信息。
        上面的程序在VB6,WIN98中文版下运行通过。
      

  3.   

    楼上的有点道理,不过好像指的是vb标准控件
    不过我还是关心首先假如操作系统已判断好,
    怎能样才能调用app.path & "\win2000\imgscan.ocx"
    并在form中建立imgscan1,
      

  4.   

    以加载imgedit.ocx为例
    Option Explicit
    Dim WithEvents obj As VBControlExtenderPrivate Sub Form_Load()
    Dim i As Integer
    'Licenses.Add "imaging.editctrl.1"
    '这是xp下测试,imaging.editctrl.1在98下可能不一致,依次来判断
    Set obj = Controls.Add("imaging.editctrl.1", "myctl", Form1)
    With obj
    .Left = 100
    .Top = 100
    .Width = 3200
    .Height = 3200
    .Visible = True
    End With
    End Sub
      

  5.   

    可以在注册表HKEY_CLASSES_ROOT\下找到控件的类名
      

  6.   

    楼上的有点道理,不过好像指的是vb标准控件
    不过我还是关心首先假如操作系统已判断好,
    怎能样才能调用app.path & "\win2000\imgscan.ocx"
    并在form中建立imgscan1,==============================
    通过上面的程序可以看到,通过WithEvents可以定义带事件相应的控件,对于标准的VB
    控件(例如CommandButton、TextBox等)可以通过VB.XXX来定义,其中XXX是控件的类的名称
    ,而对于扩展的ActiveX控件,可以通过VBControlExtender来定义,在装载扩展控件以前,
    首先要使用Licenses对象加入控件的许可证信息。要把文章看完哦~~~~~~~~~~~```
      

  7.   

    谢谢,我是看完了
    不过还是有点疑惑,总结一下楼上的各位发言,我是这样理解的,不知对不对1、在安装程序时必须判断是什么操作系统,这样根据操作系统来注册不同的OCX,是不是在程序中无法注册(要用regsrv32注册)2、在程序中还要再次判断是什么操作系统,然后写出不现的语句以上我的理解对不对
      

  8.   

    注释:Shell "regsvr32 " & TempDir & "\Mswinsck.ocx ", vbNormalFocus 注释:注册控件,有弹出对话框
        Shell "regsvr32 " & TempDir & "\Mswinsck.ocx /s", vbNormalFocus 注释:注册控件,无弹出对话框    
    MsgBox "注册成功,现在本程序可正常运行了!!", vbOKOnly, "注册控件"1.是的,可以在程序中注册,看上面的
    2.可能不需要了,控件在各个操作系统下一些关键字之类的应该相同
    你自己试试就知道了
      

  9.   

    我试过了,在win2000下编译的程序,在win2000下完全正常,
    而在98下,使用是正常的,但是退出时,就出现非法操作,tw32.dll什么出错,每个98下都是这样,当然,在98下编译应是好的,但是,如果一个程序要在三个操作系统下编译,这样以后的维护太麻烦了
      

  10.   

    那只有根据操作系统来注册不同的ocx了