我在Module1里定义一个
Type myUDT
    strA As String
    lngB As Long
End Type在Form1里
Public aa As myUDT运行时提示“常数、固定长度字符串、数组、用户定义类型以及 Declare 语句不允许作为对象模块的 Public 成员”-----------------上网搜索一下,有人说可以在类里定义,我试着建一个ActiveX DLL,然后把Type定义放在里Class1里,编译成DLL,然后在工程里引用,但还是出现上面那个提示请问要如何做,麻烦讲得详细点。谢谢了

解决方案 »

  1.   

    在Form1里
    private aa As myUDT
    or
    dim aa as myUDT
      

  2.   

    错误提示都说了 用户定义类型不允许作为对象模块的 Public 成员
      

  3.   

    To hongqi162(失踪的月亮) 可我需要在Form里建一个全局的变量(如果不用Type,那需要就需要多少全局变量)
      

  4.   

    那你就在Module1里定义
    Type myUDT
        strA As String
        lngB As Long
    End TypePublic aa As myUDT
      

  5.   

    To hongqi162(失踪的月亮)   我就是这样做的,这样不行
      

  6.   

    注意 
    Public aa As myUDT也是在Module1里定义
      

  7.   

    在哪里定义都是无法全局使用的这是VB的限制之一.....想要这么做,就使用内裤来声明类型吧http://www.m5home.com/blog/blogview.asp?logID=319工具在源代码里面
      

  8.   

    可以啊
    模块中代码:Type a
     x As Integer
     y As Integer
    End Type
    Public aa As a窗体中代码 Private Sub Form_Click()
        Print aa.x, aa.y
    End SubPrivate Sub Form_Load()
    aa.x = 111
    aa.y = 222
    End Sub
    '点击窗体后 打印111    222
      

  9.   

    问题在这里:
    //在Form1里
    Public aa As myUDT你把public改为private即可
      

  10.   

    To ayalicer(小刀惋心)  在Module1可以定义,我知道,但因为我需要用这个全局变量来保存窗体的一些状态,所以需要每个窗体都有自己定义
    To rainstormmaster(暴风雨 v2.0)  我知道问题出在这,我是想知道如何才能实现
    网上有人说可以通过公共类来实现,不知道哪位知道,能讲解一下
      

  11.   

    你要实现什么?Module1里定义一个
    Type myUDT
    strA As String
    lngB As Long
    End Type在Form1里
    private aa As myUDT
    不就行了吗
      

  12.   

    To rainstormmaster(暴风雨 v2.0)  我是想用这个全局变量来保存窗体的一些信息,供其他窗体使用。
      

  13.   

    我是想用这个全局变量来保存窗体的一些信息,供其他窗体使用。
    -----------------------------
    模块中Type a
       x As Integer
       y As Integer
    End TypePublic form1_a As a
    Public form2_a As a你的意思是不是这样就可以了?
      

  14.   

    To vbman2003(家人)   这样感觉没有放在窗体里方便,另外如果是这样定义,在不用时如何清空变量
     为什么VB有这样的限制!
      

  15.   

    To myjian(嗷嗷叫的老马--忙~~~~~~~~~~~~~~~)   “就使用内裤来声明类型吧”,这个怎么用,能不能简单讲一下
      

  16.   

    可以用变长数组
    Type myUDT
    strA As String
    lngB As Long
    End TypePublic forma() As myUDT然后在窗体Form_Initialize事件中 使用redim 即可
      

  17.   

    在模块里可以声明一个formstate数组,类型为myUDT,用来存储form的信息,可以用下标来引用
      

  18.   

    cyy201(殘羊) ( ) 信誉:100    Blog   加为好友  2007-6-2 13:50:15  得分: 0  
     
     
       
    To myjian(嗷嗷叫的老马--忙~~~~~~~~~~~~~~~)   “就使用内裤来声明类型吧”,这个怎么用,能不能简单讲一下  
     
    //使用ODL语言或EditTLB软件,生成一个tlb类型库,然后在工程里引用它那么这个类型就可以在全局使用了,并且也可以作为函数的返回值.http://www.m5home.com/blog/blogview.asp?logID=329&cateID=2这个帖子里有EditTLB工具的下载及使用
      

  19.   

    To myjian(嗷嗷叫的老马--很不顺.....最近.....很不顺.........)  谢谢你,我试试看
      

  20.   

    我好友满了....写了个例子给你:http://www.m5home.com/blog/blogview.asp?logID=331在按里面的方法声明了自定义类型后,就可以这样:'Form中Dim TestVar2 As MyUserTypePublic Property Get TestVar() As MyUserType
        TestVar = TestVar2
    End PropertyPublic Property Let TestVar(ByRef vNewValue As MyUserType)
        TestVar2 = vNewValue
    End Property这样就可以通过Form1.TestVar访问这个变量了.PS:直接在窗体里面Public TestVar As MyUserType还是不行......
      

  21.   

    就是使用类模块 然后在每个窗体中 public mystate as new class1 定义下 使用类中的public 定义的变量就可以了
      

  22.   

    窗体模块/类模块内Public定义的变量不能是用户自定义类型.建议楼上先自己测试通过后,再发帖:)
      

  23.   

    To myjian(嗷嗷叫的老马--很不顺.....最近.....很不顺.........)   原来要用Let 和 Get,我还是用Public aa As MyUserType,因为先前我也试过Public Let和Public Get,但也一样提示不行,所以就没有试这个------测试结果:EditTLB  → Add Type → record →  在下面建了三个 Field (strA BSTR;lnbB long;blnC boolean) → 保存成文件在VB里引用这个文件,建了两个窗体Form1 和 Form2,并在每个窗体上都放置两个按钮
    Form1 窗体的代码:Dim TestVar2 As MyUDT1Public Property Get TestVar() As MyUDT1
        TestVar = TestVar2
    End PropertyPublic Property Let TestVar(ByRef vNewValue As MyUDT1)
        TestVar2 = vNewValue
    End Property
    Private Sub Command1_Click()
        Form2.Show 1
    End SubPrivate Sub Command2_Click()
        Debug.Print TestVar.strA
    End SubPrivate Sub Form_Load()
        TestVar2.strA = "测试"
        TestVar2.lngB = 1000
        TestVar2.blnC = True
    End Sub
    -----Form2 窗体的代码Private Sub Command1_Click()
        With Form1.TestVar
            Debug.Print .strA, .lngB, .blnC
        End With
    End SubPrivate Sub Command2_Click()
        Form1.TestVar.strA = "在 Form2 里修改过"
    End Sub
    结果:在 Form2 获取值正常,但无法从 Form2 修改值,请问这是怎么回事,是不是我哪里弄错了。我在 Form2 的 Command2_Click 设置断点,逐步执行,发现赋值也是执行Get,而不是Let;而获取值也是执行Get
      

  24.   

    你这样不对.应该先定义一个同类型变量,然后修改变量内的值,最后再赋值到属性内.Form2里的Command2代码改一下:Private Sub Command2_Click()
        dim I as MyUDT1    I.strA = "在 Form2 里修改过"
        Form1.TestVar = I
    End Sub
      

  25.   

    To myjian(嗷嗷叫的老马--很不顺.....最近.....很不顺.........)  可以了,感谢
      

  26.   

    在类模块公用函数中用自定义类型作参数,一定不要忘了用Friend关键字申明。这招很厉害。