Avatar billede sunep Nybegynder
12. juni 2003 - 17:32 Der 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.
Avatar billede sjh Nybegynder
12. juni 2003 - 20:19 #1
hvordan ser din datatype ud....

Public Type TYPE_DIN_DATA
        dwRed  As Byte
        dwGreen As Byte
        dwBlue  As Byte
End Type
Avatar billede sunep Nybegynder
12. juni 2003 - 20:25 #2
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
Avatar billede sjh Nybegynder
12. juni 2003 - 20:33 #3
ja jeg vil godt lige se den kan du ikke poste koden af din DATATYPE
for det er vel ikke sådan den ser ud (dwRed,dwGreen,dwBlue) :-)
Avatar billede sunep Nybegynder
12. juni 2003 - 20:39 #4
Public Type clientmaindata
    commandtype As String
    message As String
End Type
Avatar billede sjh Nybegynder
12. juni 2003 - 20:56 #5
så må det være sådan:

'--------------------------- 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 ---------------------------
Avatar billede sunep Nybegynder
12. juni 2003 - 21:03 #6
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
Avatar billede sjh Nybegynder
12. juni 2003 - 21:06 #7
TypeData2Array = kopier din datatype til byte

Array2TypeData = kopier byte til din datatype
Avatar billede sunep Nybegynder
12. juni 2003 - 21:08 #8
yes det havde jeg fat i.. men hvad gør copymemory egentlig.. sorry men jeg vil gerne vide hvordan mit spil egentlig fungerer :)
Avatar billede sjh Nybegynder
12. juni 2003 - 21:13 #9
Kopierhukommelsen = copymemory
Avatar billede sjh Nybegynder
12. juni 2003 - 21:18 #10
Call CopyMemory(TilData, FraData, Length på FraData)
Avatar billede sunep Nybegynder
12. juni 2003 - 21:23 #11
Kopierhukommelsen = copymemory

du behøves ikke tro jeg er fuldstændig idiot :)

men tak for hjælpen - du får pointne når jeg får testet det engang
Avatar billede sjh Nybegynder
12. juni 2003 - 21:27 #12
Nej... fandt også en beder måde at forklar det på (så må det vel være mig som er idioten) :o)
Avatar billede sunep Nybegynder
13. juni 2003 - 09:59 #13
Jeg sad lige og tænkte på disse 2 linier.

Dim arrSend() As Byte

  ReDim arrSend(0 To bytesTotal) As Byte

de står jo lige efter hinanden...

kan man ikke bare forkorte det ned til 1 linie

Dim arrSend(0 to bytesTotal) As Byte
Avatar billede sjh Nybegynder
13. juni 2003 - 14:25 #14
kan nok fjærne den her "Dim arrSend() As Byte" men det er ikke nogle god ide. (kan ikke fjærnes hvis du bruger "Option Explicit")


Dim arrSend() As Byte '<-- Fortælde havd det er..
ReDim arrSend(0 To bytesTotal) As Byte '<-- laver du om på det array der er
Avatar billede sunep Nybegynder
13. juni 2003 - 17:25 #15
ok.. helt fint.. jeg troede bare reDim gen erklærede den som noget nyt..
Avatar billede sunep Nybegynder
13. juni 2003 - 17:56 #16
Jeg har lige smidt det ind i mit spil.. og det fungerer bare. jeg bukker og siger mange tak ;)
Avatar billede sunep Nybegynder
13. juni 2003 - 18:21 #17
Der er en fejl.. hvis min type hedder

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
Avatar billede sunep Nybegynder
13. juni 2003 - 18:24 #18
Det er copymemory tingen der ikke kan finde ud af det
Avatar billede sunep Nybegynder
13. juni 2003 - 18:35 #19
når man kører copymemory efter data er sendt og skal ha lavet bytene om til ens egen ting igen.. så siger den out of memory
Avatar billede sjh Nybegynder
13. juni 2003 - 20:05 #20
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.


'----------------------------------- Module1 -----------------------------------
Option Explicit

'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 -----------------------------------


'----------------------------------- Form1 -----------------------------------
Option Explicit

'------- 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 -----------------------------------
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester