12. juni 2003 - 17:32Der er
19 kommentarer og 1 løsning
sende variabler af egen type over winsock
jeg er ved at lave et lille netværks spil og vil så sende data til og fra serveren. der har jeg lavet min egen type i et alm. module
når jeg så opretter en variabel af denne type og vil sende den med winsock.. så får jeg denne fejl
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
og i MSDN står denne beskrivelse men jeg ved ikke hvad jeg skal gøre for at få det til at virke
This error has the following cause and solution:
You attempted to use a public user defined type as a parameter or return type for a public procedure of a class module, or as a field of a public user defined type. Only public user defined types that are defined in a public object module can be used in this manner.
Ja den ser sådan ud.. og ligger i et alm modul.. typen fungerer fint og jeg kan bruge den i hele programmet, undtaget når jeg vil sende variablen over en winsock control
'--------------------------- Module1 --------------------------- Public Type clientmaindata commandtype As String message As String End Type
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Public typeCD As clientmaindata
Public Sub TypeData2Array(ByRef arrArray() As Byte, typeData As clientmaindata) ReDim arrArray(0 To Len(typeData)) As Byte CopyMemory arrArray(0), typeData, Len(typeData) End Sub
Public Sub Array2TypeData(typeData As clientmaindata, ByRef arrArray() As Byte) CopyMemory typeData, arrArray(0), UBound(arrArray) End Sub '--------------------------- Module1 ---------------------------
'--------------------------- Form1 --------------------------- Private Sub Command1_Click() Dim arrSend() As Byte
typeCD.commandtype = "??" typeCD.message = "??"
Call TypeData2Array(arrSend, typeCD)
'nu sender du arrSend() som byte med winsock Winsock1.SendData arrSend End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim arrSend() As Byte
ReDim arrSend(0 To bytesTotal) As Byte
Winsock1.GetData arrSend
Call Array2TypeData(typeCD, arrSend)
xx = typeCD.message xx = typeCD.commandtype End Sub '--------------------------- Form1 ---------------------------
kan du forklare lidt om hvad disse 2 funktioner gør
Public Sub TypeData2Array(ByRef arrArray() As Byte, typeData As clientmaindata) ReDim arrArray(0 To Len(typeData)) As Byte CopyMemory arrArray(0), typeData, Len(typeData) End Sub
Public Sub Array2TypeData(typeData As clientmaindata, ByRef arrArray() As Byte) CopyMemory typeData, arrArray(0), UBound(arrArray) End Sub
public type testtype str1 as string str2 as string str3 as string end type
og jeg sender via din metode som byte.. så får jeg en fejl der siger out of memory..
desuden.. så vil den første variabel (i dette tilvælde str1) altid have værdien TankBuster som er mit projectnavn når den bliver sendt over winsock.. og det er selvom jeg tildeler den en anden værdi
Okay... så simulere vi det som du skal gøre med winsock.
1) Star et nyt vb project. (Project1) 2) Tilføje så et module (Module1) og en CommandButton (Command1) 3) Sæt ind så det som jeg har lavet til dig. 4) Start med Step 1 som står i Form1 koden.
'Du kan bare ændre de 50 til noget der passer ind i dit system. Public Type testtype 'Eksempel: 'str1 As String * 100 'str2 As String * 310 'str3 As String * 45
str1 As String * 50 str2 As String * 50 str3 As String * 50 End Type
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
'Din TYPE... er i typeCD Public typeCD As testtype
Public Sub TypeData2Array(ByRef arrArray() As Byte, typeData As testtype) ReDim arrArray(0 To Len(typeData)) As Byte CopyMemory arrArray(0), typeData, Len(typeData) End Sub
Public Sub Array2TypeData(typeData As testtype, ByRef arrArray() As Byte) CopyMemory typeData, arrArray(0), UBound(arrArray) End Sub '----------------------------------- Module1 -----------------------------------
'------- Step 1 ------- Dim arrSend() As Byte 'byte array til at gemme det i byde (send med winsock)
'------- Step 2 ------- Private Sub Form_Load() 'Her setter vi noget data i din TYPE... (dog max 50 pr strX) With typeCD .str1 = "Visual Basic" .str2 = "er sjovt når man kan få hjælp" .str3 = "til det man ikke selv kan lave :-)" End With
'Så kopier vi din TYPE... til arrSend som vi skal sende med winsock. Call TypeData2Array(arrSend, typeCD)
'For at være sikker på at der ikke er noget i din TYPE... så sletter vi det. With typeCD .str1 = "" .str2 = "" .str3 = "" End With End Sub
'------- Step 3 ------- Private Sub Command1_Click() 'Nu kan vi sige at du har sendt (arrSend) med winsock 'så din data legger i arrSend.
'AutoRedraw kun så vi kan se det der bliver printet. (Print Trim$(.strX)). Me.AutoRedraw = True
'Så kopier vi arrSend ud til din TYPE... Call Array2TypeData(typeCD, arrSend)
'Her bruger vi Trim$ for at fjærne SPACE og viser den data som er tilbage. With typeCD Print Trim$(.str1) Print Trim$(.str2) Print Trim$(.str3) End With End Sub '----------------------------------- Form1 -----------------------------------
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.