Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Daten synchronisieren (https://www.delphipraxis.net/2356-daten-synchronisieren.html)

Crayser 19. Jan 2003 16:28


Daten synchronisieren
 
Hallo zusammen
ich habe 2 programme; server und client. nun will ich das der server nach einer gewissen zeit einige Variablen zum Client sendet.

Code:
//Code vom Server
procedure TForm1.Timer2Timer(Sender: TObject);
var Leftstr:string;
begin
Leftstr:=inttostr(Schlaeger.Left);
ServerSocket1.Socket.Connections[0].SendText('4'+Leftstr);

//Code vom Client
empfang := ClientSocket1.Socket.ReceiveText; //client empfängt
choose:= strToInt(empfang[1]);

case choose of
1: ..
2: ..
3: ..
4: begin for i:=2 to length(empfang) do
         temp[i-1]:=empfang[i];
      SchlaegerKopf.Left:=strtoint(temp);
   end;
Das Programm kann fehlerfrei compiliert werden, doch wenn der delay von timer2 zuende ist, wird das Programm mit einem Fehler abgebrochen.

Danke für jegliche Hilfe.
Ciao Crayser

Crayser 20. Jan 2003 15:21

Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe noch die Fehlermeldung in den Anhang gesetzt. Kann mir jemand sagen was da nicht stimmen könnte?
Wenn ihr wollt, kann ich die source vom client und server noch uploaden. Doch an anderen Stellen im source dürfte der Fehler nicht liegen.

ciao Crayser

Christian Seehase 22. Jan 2003 19:59

Moin Crayser,

möglicherweise tritt der Fehler auf, beim Zugriff auf empfang[1].
Nachdem ReceiveText ausgeführt wurde, solltest Du, sicherheitshalber, prüfen, ob empfang überhaupt Daten enthält.

Ich weiss jetzt zwar nicht, wie gross das Intervall bei Deinem Timer2 ist, aber es könnte sinnvoll sein, die Routine mit einem Timer2.Enabled := false zu beginnen, und mit einem Timer2.Enabled := true zu beenden, damit sich verschiedene Timeraufrufe nicht gegenseitig überholen.

Crayser 24. Jan 2003 16:50

Kein Erfolg
 
Hi Christian

die Fehler liegen nicht an den anderen case Befehlen. Der case Befehl ist eigentlich aus if empfang=1 .. else if empfang=2 .. etc. audgebaut. Deshalb sind die Anweisungen unabhängig voneinander. Bei den 3 anderen case Befehlen läuft alles gut.

Timer2 ist nicht sehr lang; habe es trotzdem mit dem dis/enable probiert.. ohne Erfolg. Trotzdem Danke. Das timing Intervall ist auch sehr lang (macht keinen Unterschied in welchen Zeitabständen der timer aufgerufen wird).
Wie gesagt wenn du willst, kann ich den ganzen code uploaden doch ist er noch nicht fertig, da ich noch einige andere Sachen vorschieben muss. Das Programm(ist übrigens nen Spiel) ist trotzdem startbar.

ciao Crayser

Christian Seehase 24. Jan 2003 18:17

Moin Crayser,

geh' doch mal im Einzelschritt durch das Programm (F7/F8) und versuch' mal dadurch die Fehler erzeugende Stelle zu finden.
Am Besten vor der verdächtigen Stelle einen Breakpoint setzen, und dann weiter im Einzelschritt.

Crayser 25. Jan 2003 10:48

Code:
 temp[i-1]:=empfang[i];
Hallo Christian,
beim debuggen bleibt er an diesem code hängen. ich persönlich kann da aber keinen fehler erkennen. beide variablen sind strings, ich kopiere bis auf das erste zeichen den ganzen inhalt von empfang in temp. i ist in einer for schleife die bis length(empfang) läuft.

Chewie 25. Jan 2003 11:02

Mit welchem Wert beginnt die Schleife denn? Nach dem, was du geschriebenn hast, müsste sie mit i=2 beginnen.

Crayser 25. Jan 2003 14:48

Ah ich hab den Fehler gefunden. Ich hatte die Größe der strings nicht deklariert und daher kam der Fehler. Jetzt ist es aber nun ziemlich unpraktischt, da ich das Ende von temp bestimmen muss. Je nachdem wie groß der integerwert von empfang ist, variiert das ende von temp. Gibt es da einen eleganteren Weg, als alle (bzw. die Endwerte) von temp vorher auf #0 zu setzen?
Danke für die Tipps Christian.

ja die Schleife hängt mit i=2 an, da bei empfang[1] nur der Wert für die case Anweisung ist bei i=2 bis ende hab ich dann die info, die der server an den clienten weitergeben soll.

Christian Seehase 25. Jan 2003 18:04

Moin Crayser,

hast Du jetzt temp : string[...] deklariert?
Das wäre dann ein ShortString.

Die Länge initalisieren ginge, z.B., mit SetLength, oder auch einer Zuweisung von StringOfChar.
Wie gross temp dabei wird kannst Du dann ja anhand der Länge von empfang festlegen.

Crayser 3. Feb 2003 11:38

Hallo Christian
wird dann die Länge des Strings dynamisch geregelt? Also kann ich dann getrost die Auffüllung mit #0 weglassen wenn ich die Länge mit SetLength deklariere? Muss ich mal ausprobieren.

Nun hab ich aber ein anderes Problem, wo ich noch nicht so schnell eine Lösung finden konnte. Und zwar will ich gleich mehrere Informationen aufeinmal per Netzwerk senden. Jedoch ist sendText bzw. ReceiveText (ich weiss nicht genau welche die Probleme bereitet) bei mehreren Aufrufen hintereinander ziemlich problematisch, da (ich vermute) die case Anweisung noch nicht zuende gearbeitet werden konnte bevor der Client schon eine neue Anweisung erhält.
Da dachte ich mir ich sende gleich alle Informationen auf einmal in einem String. Was mein Problem ist könnt ihr euch ja denken. Wie kann ich die Befehlsinformationen auseinanderhalten (bzw. unterscheiden wo das Ende und wo der Anfang der nächsten Information ist). Die Länge variiert.

Deshalb bringt mir ..SendText(Info1+Info2+..) nichts, da ich nicht genau weiss ab wann/wo die zB Info2 beginnt. Ich dachte mir das man irgendwelche speziellen Zeichen als Indikator für das Ende der Strings machen könnte doch weiss ich nicht wie ich es ins Programm umsetzen kann. Habt ihr/hast du eine Idee?

Ciao Crayser

P.S.: Sorry, das ich so lange nicht zurückgeschrieben hab, die Zeit ist bei mir im Moment ziemlich knapp.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz