在vb中使用ParamArray来传递参数,所传的参数中包含一个结构,怎么传递?
在vb中使用ParamArray来传递参数,所传的参数中包含一个结构,怎么传递?ParamArray中好像不能够识别结构体的。 --------------------编程问答-------------------- 1.把结构体拆开传2.传结构体地址,在过程中Copy回来即可。 --------------------编程问答-------------------- 似乎是不可以,但是可以用间接方法代替,比如把Structure参数先转换成一个字符串,然后在需要调用的函数里再把该字符串按照结构格式解析出来。
--------------------编程问答-------------------- Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Type aa
bb As Long
cc As Long
End Type
Sub dd(ParamArray v() As Variant)
Dim e As aa, add As Long
add = v(1)
CopyMemory e, ByVal add, Len(e)
Debug.Print v(0), e.bb, e.cc
End Sub
Private Sub Form_Load()
Dim a As aa
a.bb = 366
a.cc = 255
dd 144, VarPtr(a)
End Sub --------------------编程问答-------------------- 如果不明白原理请回帖,我帮你解释。 --------------------编程问答-------------------- 这个我明白,谢谢,不过有结构的时候传地址总是报错。真弄不明白。 --------------------编程问答-------------------- 呃...........跳过. --------------------编程问答-------------------- 呃....应该是"路过"........按快了....-_- --------------------编程问答-------------------- ParamArray 参数类型通常为 Variant,你的问题出在必须是公共的结构才可以通过 Variant 传递。
所以:
方案A:将结构声明在 tlb 中;
方案B:将结构声明在 ActiveX Dll 工程的公共类中。 --------------------编程问答-------------------- Tiger_zhao,怎么联系你,能跟您聊下吗?我的QQ是80467692,谢谢。我不明白你的意思。 --------------------编程问答-------------------- 假设这是原先编译不通过的代码
'Project1 - Standard EXE
'Module1
Option Explicit
Public Type TypeX
value As Long
End Type
Sub Main()
Dim t As TypeX
f t
End Sub
Sub f(ParamArray a())
End Sub
添加一个 ActiveX Dll 的工程,将 TypeX 剪切到默认的 Class1 中
'Project2 - ActiveX Dll
'Class1
Option Explicit
Public Type TypeX
value As Long
End Type
然后在 Project1 中添加对 Project2 的引用,以下代码就能通过了
'Project1 - Standard EXE--------------------编程问答-------------------- 就象传数组一样,在参数中传入结构的首个元素,然后用COPYMEMORY整个结构的长度,来得到结构内容.
'Module1
Option Explicit
Sub Main()
Dim t As TypeX
f t
End Sub
Sub f(ParamArray a())
End Sub
没有实际测试,应该可行. --------------------编程问答-------------------- 不推荐用 CopyMemory,如果结构的成员是字符串或数组等类型时很容易出错。 --------------------编程问答-------------------- 我现在用了CopyMemory,但是总是报错,我再试试Tiger_Zhao兄的方法。谢谢你们了。我试后再回复。 --------------------编程问答-------------------- 其实楼主可以使用类来模拟结构体,如果结构体中还包括结构体,则还可以嵌套类来实现,比如:
用一个类(类名MyRECT)来模拟RECT结构,代码如下:
Public top As Long
Public left As Long
Public right As Long
Public bottom As Long
测试代码如下:
Sub main()
Dim myR As New MyRECT
With myR
.top = 10
.left = 10
.right = 100
.bottom = 100
End With
Call test(myR)
Set myR = ReturnRect
Debug.Print myR.top, myR.left, myR.right, myR.bottom
Set myR = Nothing
End Sub
'传递模拟结构参数
Sub test(myR As MyRECT)
Debug.Print myR.top, myR.left, myR.right, myR.bottom
End Sub
'返回模拟结构
Function ReturnRect() As MyRECT
Static myR As New MyRECT
myR.top = 20
myR.left = 20
myR.right = 50
myR.bottom = 100
Set ReturnRect = myR
End Function
--------------------编程问答-------------------- 楼上的想法非常好! --------------------编程问答-------------------- 但是在类模块中不能这么定义 public progFile as string*256 啊,这样就没有办法定义它的长度,程序运行的时候还是出错 。 --------------------编程问答-------------------- 不知这样算不?
'在class1中--------------------编程问答-------------------- public progFile as string*256
Option Explicit
Private NewValue As String * 256
Public Property Get progFile() As String
progFile = NewValue
End Property
Public Property Let progFile(ByVal vNewValue As String)
NewValue = Left(vNewValue, 256)
End Property
'在Form中
Option Explicit
Private Sub Form_Load()
Dim c As New Class1
c.progFile = String(260, "c")
Debug.Print Len(c.progFile)
End Sub
楼主可以把字符串指针 progFile在类里初始化啊,比如:
Public top As Long
Public left As Long
Public right As Long
Public bottom As Long
Public progFile As String
Private Sub Class_Initialize()
prog = String(256, vbNullChar) '初始化字符串
End Sub
Private Sub Class_Terminate()
progFile = "" '删除字符串指针
End Sub
--------------------编程问答-------------------- --------------------编程问答-------------------- 有点难度哦 --------------------编程问答-------------------- 不会,帮顶
补充:VB , 资源