当前位置:编程学习 > VB >>

在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
'Module1
Option Explicit

Sub Main()
    Dim t As TypeX
    f t
End Sub

Sub f(ParamArray a())

End Sub
--------------------编程问答-------------------- 就象传数组一样,在参数中传入结构的首个元素,然后用COPYMEMORY整个结构的长度,来得到结构内容.
没有实际测试,应该可行. --------------------编程问答-------------------- 不推荐用 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中
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
--------------------编程问答-------------------- public progFile as string*256
楼主可以把字符串指针 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 ,  资源
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,