如何在窗体模块里定义一个自定义类型的全局变量

cyy201 2007-06-01 10:20:58
我在Module1里定义一个
Type myUDT
strA As String
lngB As Long
End Type

在Form1里
Public aa As myUDT

运行时提示“常数、固定长度字符串、数组、用户定义类型以及 Declare 语句不允许作为对象模块的 Public 成员”

-----------------

上网搜索一下,有人说可以在类里定义,我试着建一个ActiveX DLL,然后把Type定义放在里Class1里,编译成DLL,然后在工程里引用,但还是出现上面那个提示

请问要如何做,麻烦讲得详细点。谢谢了
...全文
1097 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
sansong2005 2012-09-01
  • 打赏
  • 举报
回复
在类模块公用函数中用自定义类型作参数,一定不要忘了用Friend关键字申明。这招很厉害。
cyy201 2007-06-05
  • 打赏
  • 举报
回复
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 MyUDT1

Public Property Get TestVar() As MyUDT1
TestVar = TestVar2
End Property

Public Property Let TestVar(ByRef vNewValue As MyUDT1)
TestVar2 = vNewValue
End Property


Private Sub Command1_Click()
Form2.Show 1
End Sub

Private Sub Command2_Click()
Debug.Print TestVar.strA
End Sub

Private 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 Sub

Private Sub Command2_Click()
Form1.TestVar.strA = "在 Form2 里修改过"
End Sub


结果:在 Form2 获取值正常,但无法从 Form2 修改值,请问这是怎么回事,是不是我哪里弄错了。

我在 Form2 的 Command2_Click 设置断点,逐步执行,发现赋值也是执行Get,而不是Let;而获取值也是执行Get
嗷嗷叫的老马 2007-06-05
  • 打赏
  • 举报
回复
不客气
cyy201 2007-06-05
  • 打赏
  • 举报
回复
To myjian(嗷嗷叫的老马--很不顺.....最近.....很不顺.........)

可以了,感谢
嗷嗷叫的老马 2007-06-05
  • 打赏
  • 举报
回复
窗体模块/类模块内Public定义的变量不能是用户自定义类型.

建议楼上先自己测试通过后,再发帖:)
嗷嗷叫的老马 2007-06-05
  • 打赏
  • 举报
回复
你这样不对.

应该先定义一个同类型变量,然后修改变量内的值,最后再赋值到属性内.

Form2里的Command2代码改一下:

Private Sub Command2_Click()
dim I as MyUDT1

I.strA = "在 Form2 里修改过"
Form1.TestVar = I
End Sub
  • 打赏
  • 举报
回复
就是使用类模块 然后在每个窗体中 public mystate as new class1 定义下 使用类中的public 定义的变量就可以了
嗷嗷叫的老马 2007-06-05
  • 打赏
  • 举报
回复
我好友满了....

写了个例子给你:

http://www.m5home.com/blog/blogview.asp?logID=331

在按里面的方法声明了自定义类型后,就可以这样:

'Form中

Dim TestVar2 As MyUserType

Public Property Get TestVar() As MyUserType
TestVar = TestVar2
End Property

Public Property Let TestVar(ByRef vNewValue As MyUserType)
TestVar2 = vNewValue
End Property

这样就可以通过Form1.TestVar访问这个变量了.

PS:

直接在窗体里面Public TestVar As MyUserType还是不行......
嗷嗷叫的老马 2007-06-04
  • 打赏
  • 举报
回复
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工具的下载及使用
cyy201 2007-06-04
  • 打赏
  • 举报
回复
To myjian(嗷嗷叫的老马--很不顺.....最近.....很不顺.........)

 谢谢你,我试试看
rainstormmaster 2007-06-02
  • 打赏
  • 举报
回复
楼上的应该可以了
vbman2003 2007-06-02
  • 打赏
  • 举报
回复
我是想用这个全局变量来保存窗体的一些信息,供其他窗体使用。
-----------------------------
模块中

Type a
x As Integer
y As Integer
End Type

Public form1_a As a
Public form2_a As a

你的意思是不是这样就可以了?
cyy201 2007-06-02
  • 打赏
  • 举报
回复
To rainstormmaster(暴风雨 v2.0)

 我是想用这个全局变量来保存窗体的一些信息,供其他窗体使用。
rainstormmaster 2007-06-02
  • 打赏
  • 举报
回复
你要实现什么?

Module1里定义一个
Type myUDT
strA As String
lngB As Long
End Type

在Form1里
private aa As myUDT
不就行了吗
cyy201 2007-06-02
  • 打赏
  • 举报
回复
To ayalicer(小刀惋心)

 在Module1可以定义,我知道,但因为我需要用这个全局变量来保存窗体的一些状态,所以需要每个窗体都有自己定义


To rainstormmaster(暴风雨 v2.0)

我知道问题出在这,我是想知道如何才能实现


网上有人说可以通过公共类来实现,不知道哪位知道,能讲解一下
fankun 2007-06-02
  • 打赏
  • 举报
回复
在模块里可以声明一个formstate数组,类型为myUDT,用来存储form的信息,可以用下标来引用
rainstormmaster 2007-06-02
  • 打赏
  • 举报
回复
问题在这里:
//在Form1里
Public aa As myUDT

你把public改为private即可
  • 打赏
  • 举报
回复
可以用变长数组
Type myUDT
strA As String
lngB As Long
End Type

Public forma() As myUDT

然后在窗体Form_Initialize事件中 使用redim 即可
  • 打赏
  • 举报
回复
明白楼主意思了 你是要给窗体加个状态属性
  • 打赏
  • 举报
回复
可以啊
模块中代码:

Type a
x As Integer
y As Integer
End Type
Public aa As a

窗体中代码

Private Sub Form_Click()
Print aa.x, aa.y
End Sub

Private Sub Form_Load()
aa.x = 111
aa.y = 222
End Sub
'点击窗体后 打印111 222
加载更多回复(9)

7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧