我要在.bas模块中创建一个PictureBox对象,是如何操作呢?
我的代码:
dim obj_pic as PictureBox '定义一个变量(不知道称呼'变量' 还是 '对象')set obj_pic=new PictureBox '使用关键字Set和New创建一个新的PictureBox对象。但是这行是不行的!请问各位,我该如何用代码创建一个PictureBox对象?谢谢!

解决方案 »

  1.   

    直接dim obj_pic as PictureBox即可啊
      

  2.   

    cso(sjxsoft-天水是我家)的方法是:不行的,我刚刚试过啦.谢谢!
      

  3.   

    如果只是定义了一个PictureBox对象pp,当我要使用pp的属性时,VB提示(对象变量或With块变量末设置)哦!
    我该如何创建一个新的PictureBox对象pp呢?
      

  4.   

    Bas:public obj_pic as PictureBox在Form1内:
    Set obj_pic = Picture1
    obj_pic.Left = 0
    obj_pic.Width = 3000
    obj_pic.Height = 5000
      

  5.   

    lie78(xiao lie)
    出现错误时应该还没有实例化
      

  6.   

    回复w18ily
    你的方法不行啊!(VB提示:变量末定义)
    我知道是对象还没有实例化.现在我就是想请教大家,如何才能实例化呢?回复BlueBeer
    加上WithEvents关键字定义自定义事件名,跟创建实例是没关系的.请大家继续想想方法!谢谢!
      

  7.   

    看看下面的~~WithEvents 关键字,说明 varname 是一个用来响应由 ActiveX 对象触发的事件的对象变量。只有在类模块中才是合法的。使用 WithEvents,可以声明任意个所需的单变量,但不能使用 WithEvents 创建数组。New 和 WithEvents 不能一起使用。 你用下面的代码试试Private WithEvents mytxt As TextBoxPrivate Sub Form_Load()
        Set mytxt = Controls.Add("vb.textbox", "text1", Me)
        mytxt.Move 1000, 1000, 1500, 300
        mytxt.Visible = True
    End SubPrivate Sub mytxt_Change()
        MsgBox "textbox changed"
    End Sub运行后,在textbox输入,将会触发change事件
    然后你从上面的代码中去掉withevents关键字,再运行试一试
      

  8.   

    Picture1是一个真正的picturebox控件,你是不是没创建,也可以用下面的方法自己创建,我最开始给的例子是需要自己手工创建的,下面的是用代码创建的~~
      

  9.   

    dim pc1 as object
    set pc1=picture1
      

  10.   

    //w18ily(再回首,西门吹沙(学习网络编程)) :晕~
      

  11.   

    dim obj_pic as  NEW PictureBox
    然后在你要引用的事件里面直接调用就可以了
      

  12.   

    //出现错误时应该还没有实例化同意,我的理解是,那样定义一个picturebox只是申请了一个4字节的内存空间,用来存放指向一个picturebox内存地址的内存地址,但你并没有赋值给obj_pic一个picturebox的实例,所以它的内容仍然是nothing,自然不能取得它的属性和使用它的方法啦
      

  13.   

    w18ily(再回首,西门吹沙(学习网络编程))的可以了
      

  14.   

    只是定义的话,用controls.add对它进行实例化,就可以了,不过,不建议这么做,建议这样:
    public functin test(pic as picturebox)
    '你的代码
    end function然后在需要时调用函数
      

  15.   

    dim obj_pic as  new PictureBox
      

  16.   

    //出现错误时应该还没有实例化同意,我的理解是,那样定义一个picturebox只是申请了一个4字节的内存空间,用来存放指向一个picturebox内存地址的内存地址,但你并没有赋值给obj_pic一个picturebox的实例,所以它的内容仍然是nothing,自然不能取得它的属性和使用它的方法啦
    *************************************************
    同意BlueBeer的观点。
      

  17.   

    BlueBeer的解释是对的
    可是并没有回答楼主的问题哦
    楼主知道错误是因为picturebox还没有实例化
    但是问题是如何使之实例化用controls.add是可以实现用代码添加一个控件
    不过按照面向对象的概念,在模块里声明一个空间对象
    再实例化,逻辑上也是行得通得,除非VB里不支持这样做
      

  18.   

    以前用过
    public picP as picture
    用来在内存中保存图形文件
    具体代码想不起来了
    回去查书吧....
      

  19.   

    dim 换成public试试,picturebox初始一下.
      

  20.   

    1.首先 with events不能用在模块里的,类模块可以。
    2.楼主的问题其实问得很好,我也遇到过这样的问题,我是这样理解和解决的:
      因为“控件本身的要放在容器里”,如form,frame等等,
      所以如果要在窗体内动态生成控件可以用Controls.Add来添加,而在模块和类模块则不可以.
      解决的办法是:你可以在类模块中声明这些变量,然后在窗体中添加控件,
      再通过参数的办法传递到类模块中,然后在类模中用set语句,之后想怎么操作都可以了。
      
      举一例子:
      有一个停车场的显示屏,厂家没有做动态库,只提供了低层的协议(要显示什么就发什么到串口),
      为了软件调用的方便,理应自已做成动态库的(要用vc,偶不会呀),但我做成类模块。
      串口通信我用mscomm,这里就出现了楼主的问题了(要在类模块中生成控件)
      于是我在模块中声明了个mscomm(如Mymscomm),成了个init的过程,在过程中用set语句
       set Mymscomm = 传入来的mscomm,那么以后对Mymscomm的操作都可以了.
      

  21.   

    楼上的回答的太好了BTW:另外感觉有些版友回答问题太随便
         有些代码自己都不测试一下就贴出来指导别人
      

  22.   

    我是这样解决的:
    1,你先建一个form 如 MyForm
    2,你在form里加一个PictureBox 如 MyPic
    3,在模块引的对象就是 MyForm.MyPic楼上  bciAnson  的说法是正确的!
      

  23.   

    private objP as picture
    set objP = loadpicture("......")
      

  24.   

    我又发现一个问题,按照一些大虾说得
    我测试以下简单的代码,会出现“类型不符合”的错误
    请各位指教一下Private Sub Command1_Click()    ShowName (Form1)End SubPublic Sub ShowName(ByRef mForm As Form)    MsgBox mForm.CaptionEnd Sub
      

  25.   

    dim pp as new picturebox就行了,很简单
      

  26.   

    致bciAnson(Anson):
         
           先谢谢bciAnson!!!  我觉得bciAnson有一定的道理.但小弟我生性愚蠢,不知道bciAnson能否赐几行简单的代码经我试试呢?让大家一起来认识这个问题.谢谢!!!
      

  27.   

    我按照那个思路自己写了一下类模块代码:
    Public mPictureBox As VB.PictureBoxPublic Sub init(ByRef mm As Object)    If mm Is Nothing Then
            MsgBox "对象为空!!!"
            Exit Sub
        End If
        
        Set mPictureBox = mmEnd Sub窗体里的代码:
    Private Sub Command1_Click()
        
        Dim obj As New Class1
        Dim mPicBox As PictureBox
        Set mPicBox = Controls.Add("vb.picturebox", "Test", Me)
        Call obj.init(mPicBox)
        obj.mPictureBox.Visible = True
        
    End Sub
      

  28.   

    '*********************************
    '*                               *
    '*          ClassDisplay         *
    '*                               *  
    '*********************************
    Option Explicit
    Dim myMscom As MSComm
    Dim mvarPortNum As String
    Dim mvarSettings As String
    Public blnInit As BooleanPublic Enum DisplayAction
      DisplayCarType = 1
      DisplayMoney = 2
      DisplaySayHello = 3
      DisplaySayGoodbye = 4
      DisplaySetOFF = 5
    End EnumPublic Sub initial(ByVal Mscom As MSComm, ByVal myComPort As Integer, Optional ByVal mySetting As String = "2400,n,8,1")
        Set myMscom = Mscom
        myMscom.Settings = mySetting
        myMscom.CommPort = myComPort
        mvarSettings = myMscom.Settings
        mvarPortNum = myMscom.CommPort
        blnInit = True
    End Sub'Settting
    Public Property Let CommSettings(ByVal vData As String)
        If Not blnInit Then
           Err.Raise 1001, , "未初始化,不能赋值"
           Exit Property
        End If
        mvarSettings = vData
        myMscom.Settings = vData
    End PropertyPublic Property Get CommSettings() As String
        If Not blnInit Then
           Err.Raise 1002, , "未初始化,不能取值"
           Exit Property
        End If
        CommSettings = mvarSettings
    End PropertyPublic Property Let CommPortNum(ByVal vData As String)
        If Not blnInit Then
           Err.Raise 1001, , "未初始化,不能赋值"
           Exit Property
        End If
        mvarPortNum = vData
        myMscom.Settings = vData
    End PropertyPublic Property Get CommPortNum() As String
        If Not blnInit Then
           Err.Raise 1002, , "未初始化,不能取值"
           Exit Property
        End If
        CommPortNum = mvarPortNum
    End Property'显示车型
    Private Sub ShowCarType(ByVal intType As Integer)
    Dim binbuff(6) As Byte
      If Not blnInit Then
         Err.Raise 1003, , "未初始化,不能不能执行该操作"
         Exit Sub
      End If
      binbuff(0) = &H7E
      binbuff(1) = &H7E
      binbuff(2) = &H7E
      binbuff(3) = Asc("T")
      binbuff(4) = intType
      binbuff(5) = binbuff(3) Xor binbuff(4)
      binbuff(6) = 0
      If Not myMscom.PortOpen = True Then myMscom.PortOpen = True
      myMscom.Output = binbuff
      myMscom.PortOpen = False
    End Sub'显示金额
    Private Sub ShowMoney(ByVal intMoney As Integer)
    Dim binbuff(6) As Byte
      If Not blnInit Then
         Err.Raise 1003, , "未初始化,不能不能执行该操作"
         Exit Sub
      End If
      binbuff(0) = &H7E
      binbuff(1) = &H7E
      binbuff(2) = &H7E
      binbuff(3) = Asc("M")
      binbuff(4) = intMoney
      binbuff(5) = binbuff(3) Xor binbuff(4)
      binbuff(6) = 0
      If Not myMscom.PortOpen = True Then myMscom.PortOpen = True
      myMscom.Output = binbuff
      myMscom.PortOpen = False
    End Sub'显示欢迎光临
    Private Sub SayHello()
    Dim binbuff(6) As Byte
      If Not blnInit Then
         Err.Raise 1003, , "未初始化,不能不能执行该操作"
         Exit Sub
      End If
      binbuff(0) = &H7E
      binbuff(1) = &H7E
      binbuff(2) = &H7E
      binbuff(3) = Asc("S")
      binbuff(4) = 0
      binbuff(5) = binbuff(3) Xor binbuff(4)
      binbuff(6) = 0
      If Not myMscom.PortOpen = True Then myMscom.PortOpen = True
      myMscom.Output = binbuff
      myMscom.PortOpen = False
    End Sub'显示一路顺风
    Private Sub SayGoodbye()
    Dim binbuff(6) As Byte
      If Not blnInit Then
         Err.Raise 1003, , "未初始化,不能不能执行该操作"
         Exit Sub
      End If
      binbuff(0) = &H7E
      binbuff(1) = &H7E
      binbuff(2) = &H7E
      binbuff(3) = Asc("S")
      binbuff(4) = 1
      binbuff(5) = binbuff(3) Xor binbuff(4)
      binbuff(6) = 0
      If Not myMscom.PortOpen = True Then myMscom.PortOpen = True
      myMscom.Output = binbuff
      myMscom.PortOpen = False
    End Sub'熄屏
    Private Sub SetOFF()
    Dim binbuff(6) As Byte
      If Not blnInit Then
         Err.Raise 1003, , "未初始化,不能不能执行该操作"
         Exit Sub
      End If
      binbuff(0) = &H7E
      binbuff(1) = &H7E
      binbuff(2) = &H7E
      binbuff(3) = Asc("O")
      binbuff(4) = Asc("f")
      binbuff(5) = binbuff(3) Xor binbuff(4)
      binbuff(6) = 0
      If Not myMscom.PortOpen = True Then myMscom.PortOpen = True
      myMscom.Output = binbuff
      myMscom.PortOpen = False
    End SubPublic Sub Display(ByVal Action As DisplayAction, Optional intDisplayParam As Integer = 0)
      If Not blnInit Then
         Err.Raise 1003, , "未初始化,不能不能执行该操作"
         Exit Sub
      End If  Select Case Action
        Case DisplayCarType:
                             Call ShowCarType(intDisplayParam)
        Case DisplayMoney:
                             Call ShowMoney(intDisplayParam)
        Case DisplaySayHello:
                             Call SayHello
        Case DisplaySayGoodbye:
                             Call SayGoodbye
        Case DisplaySetOFF:
                             Call SetOFF
      End Select
    End Sub
    '*********************************
    '*                               *
    '*          窗体的调用            *
    '*                               *  
    '*********************************
    Option Explicit
    Dim myDisplay As New ClassDisplay
    Dim msComm1 As MSComm
      
    Private Sub cmdInit_Click()
      If myDisplay.blnInit = False Then Set msComm1 = Controls.Add("MSCommLib.MSComm", "MSComm1")
      Call myDisplay.initial(msComm1, txtPort.Text)
    End SubPrivate Sub cmdCardType_Click()
      myDisplay.Display DisplayCarType, (txtType.Text)
    End SubPrivate Sub cmdMoney_Click()
      myDisplay.Display DisplayMoney, (txtMoney.Text)
    End SubPrivate Sub cmdHello_Click()
      myDisplay.Display DisplaySayHello
    End SubPrivate Sub cmdGoodbye_Click()
      myDisplay.Display DisplaySayGoodbye
    End SubPrivate Sub cmdSetOff_Click()
      myDisplay.Display DisplaySetOFF
    End Sub
      

  29.   

    hongbo163(虫子) 
    对了,我也是这么做的。
      

  30.   

    hongbo163(虫子) 和 bciAnson(Anson) 两大高手都能讲出理论,给出可行的代码。尤其是bciAnson(Anson),虽然代码有点详细(看得小弟我头晕),但助人之心实在可敬。使小弟和其它VB爱好都学到新知识。小弟决定给两位高手每人50分(不能再多了,系统不允许!),以表示小弟的万分感谢!