首先,我使用的VB6,不是VB.NET。在程序中我需要一个自定义的类型——也就是相当于C中结构,定义如下:
   Type Point
       X as Integer
       Y as Integer
   End Type
   然后,我需要用这个类型定义一个类(Name是Shape)中的公共函数的参数,如下:
   Public Function SetStarCenter(aPt as Point) As Integer.
 
   问题在于:我应该把这个类型Point的声明写在哪儿?   我尝试过写在类Shape的声明区,前面冠以Public关键字(按照MSDN的说法,加不加Public是一样的),出现编译错误:Compile Error:Cannot define a Public user-defined type within a private object module
   再尝试写在一个普通模块(Standard Module)的声明区,前面冠以Public关键字(按照MSDN的说法,加不加Public是一样的),又出现编译错误:Compile Error:Only public user defined types defined in public object modules can be used as parameters or return types for public procedures of class modules or as fields of public user defined types。注意:这次编译器定位出错的地方是函数上面定义公共函数SetStarCenter的地方。
   那么我应该如何声明这个类型,才能够用它来定义一个公共函数的参数呢?(当然,我可以把Point声明成一个类模块,不过对如此简单的一个结构,似乎有点太大材小用了)

解决方案 »

  1.   

    其中模块代码:
     Option Explicit  Type Point
           X As Integer
           Y As Integer
       End Type
    Public Sub setValue(mm As Point)
       MsgBox "X的值为:" & mm.X & ",Y的值为:" & mm.Y
    End Sub
    窗体代码:
    Option ExplicitPrivate Sub Form_Load()
    Dim a As Point
    a.X = 6
    a.Y = 7
    setValue a
    End Sub
      

  2.   

    'in Form
    Private Sub Test()
        Dim pt as Point
        Dim clsShape As Shape
        Set clsShape = New Shape
        clsShape.SetStarCenter Varptr(pt)
        Msgbox "x=" & Cstr(pt.x) & vblf & "y=" & Cstr(pt.y)
    End Sub'in module
    Public Type Point
        X as Integer
        Y as Integer
    End Type
    Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)'in class
    '傳遞自定義類型變量的內存地址
    Public Function SetStarCenter(Byval lpPt as Long) As Integer
        Dim pt As Point
        pt.x = 100
        pt.y = 200
        CopyMemory Byval lpPt, Byval Varptr(pt), Len(pt)
    End Function
      

  3.   

    leolan(史留香)的办法倒是应该行得通,而且相当巧妙,佩服佩服!不过这样代码的可读性就不好了,我可能还是会选择用类。
      

  4.   

    BTW:我其实是最近做这个项目才开始用VB的,不过我想VB已经如此成熟了,如果这个问题当真无解,应该会有一个说法吧。希望哪位高手能给一个断言!
      

  5.   

    做成ActiveX Dll可解決此類問題。