Avatar billede lau- Nybegynder
03. april 2006 - 14:45 Der er 5 kommentarer og
1 løsning

Fejl ved sending/modtagelse af data fra Winsock komponent

Goddag. Min ven og jeg er i forbindelse med et projekt på skolen i Visual Basic 6 igang med at programmere et Tegn og gæt spil som fungerer over netværk vha. Winsock komponenter.

Vi har en PictureBox, og så er der en klient der tegner, og vi skulle gerne have overført det som bliver tegnet over til den klient som skal gætte.

Det gør vi via en Winsock komponent hvor vi sender X og Y koordinaterne når der enten klikkes (for at definere hvor tegningen starter) eller når musen bevæges og museknappen er nede (for at sende koordinaterne for hvad brugeren tegner).

Koordinaterne sendes i formatet:
Xkoordinat:Ykoordinat, eksempel: 1234:5678.

Det sker med følgende kode:

Private Sub pctTegning_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    pctTegning.CurrentX = X
    pctTegning.CurrentY = Y
    sckTegn.SendData X & ":" & Y
End Sub

Private Sub pctTegning_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 And sckTegn.State = 7 Then
        pctTegning.Line -(X, Y)
        sckTegn.SendData X & ":" & Y
    End If
End Sub


Klienten som skal gætte hvad der tegnes modtager nu koordinatsættene med følgende kode:

Private Sub sckTegn_DataArrival(ByVal bytesTotal As Long)
    Dim IncomeData As String
    Dim Koords
    sckTegn.GetData IncomeData
    Koords = Split(IncomeData, ":")
    X = CSng(Koords(0))
    Y = CSng(Koords(1))
    pctTegning.Line -(X, Y)
End Sub

----

Problemet består nu i, at IncomeData ved sckTegn_DataArrival bliver "stacked" oven i hindanden, og IncomeData bliver ikke "tømt" hver gang.
For eksempel resulterer IncomeData i at se således ud:
1234:56781234:56781234:56781234:5678, osv...

Det er det vi ikke forstår hvorfor den gør, da den skulle blive clearet hver gang.
Vi har også prøvet at tilføje IncomeData = "" til sidst, for at tømme den.


Jeg håber virkelig at nogen kan hjælpe, har haft dette problem i 3 uger nu, og skal aflevere om 3 uger, så det haster lidt :)

På forhånd mange tak!
Avatar billede sjh Nybegynder
03. april 2006 - 22:09 #1
Det kunne godt være Split() som ikke er hurtig nok til at opdele data.. prøv med lidt api..


' ---------------------- API ----------------------
' Denne stump i toppen.. (på jeres Form og i bægge project'er)
Private Type POINTAPI
        X As Long
        Y As Long
End Type

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
' ---------------------- API ----------------------


' Her er så den nye kode til det..

Private Sub pctTegning_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim pt As POINTAPI
Dim bData(7) As Byte
  pctTegning.CurrentX = X
  pctTegning.CurrentY = Y
  CopyMemory bData(0), pt, 8 ' Kopier 'pt' til 'bData'
  sckTegn.SendData bData ' Sender 'bData'
End Sub

Private Sub pctTegning_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim pt As POINTAPI
Dim bData(7) As Byte
  If Button = 1 And sckTegn.State = 7 Then
    pctTegning.Line -(X, Y)
    CopyMemory bData(0), pt, 8 ' Kopier 'pt' til 'bData'
    sckTegn.SendData bData ' Sender 'bData'
  End If
End Sub

Private Sub sckTegn_DataArrival(ByVal bytesTotal As Long)
Dim pt As POINTAPI
Dim bData(7) As Byte
  If bytesTotal = 8 Then
    sckTegn.GetData bData, vbByte, bytesTotal
    CopyMemory pt, bData(0), 8 ' Kopier 'bData' til 'pt'
    pctTegning.Line -(pt.X, pt.Y)
  End If
End Sub
Avatar billede sjh Nybegynder
03. april 2006 - 22:12 #2
Ha ha.. skal lige ha det hele med.. de 2 her skal se sådan ud:

Private Sub pctTegning_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim pt As POINTAPI
Dim bData(7) As Byte
  pctTegning.CurrentX = X
  pctTegning.CurrentY = Y
  pt.X = X
  pt.Y = Y
  CopyMemory bData(0), pt, 8 ' Kopier 'pt' til 'bData'
  sckTegn.SendData bData ' Sender 'bData'
End Sub

Private Sub pctTegning_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim pt As POINTAPI
Dim bData(7) As Byte
  If Button = 1 And sckTegn.State = 7 Then
    pctTegning.Line -(X, Y)
    pt.X = X
    pt.Y = Y
    CopyMemory bData(0), pt, 8 ' Kopier 'pt' til 'bData'
    sckTegn.SendData bData ' Sender 'bData'
  End If
End Sub
Avatar billede lau- Nybegynder
03. april 2006 - 22:28 #3
Jeg takker meget for at du gad svare. Jeg bliver nødt til at vente til imorgen med at afprøve det.

Når du snakker om API er det umiddelbart ikke noget jeg har arbejdet med før. Kræver det at jeg indsætter nogle flere komponenter på min brugergrænseflade, eller er et nok udelukkende med koden?
Avatar billede sjh Nybegynder
04. april 2006 - 12:54 #4
udelukkende med koden..
Avatar billede lau- Nybegynder
05. april 2006 - 09:07 #5
Jeg har selv fået ordnet mit problem.
Avatar billede sjh Nybegynder
05. april 2006 - 14:21 #6
Godt nok.. men hvad var løsningen så??
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