![]() |
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:
Das Programm kann fehlerfrei compiliert werden, doch wenn der delay von timer2 zuende ist, wird das Programm mit einem Fehler abgebrochen.
//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; Danke für jegliche Hilfe. Ciao Crayser |
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 |
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. |
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 |
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. |
Code:
Hallo Christian,
temp[i-1]:=empfang[i];
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. |
Mit welchem Wert beginnt die Schleife denn? Nach dem, was du geschriebenn hast, müsste sie mit i=2 beginnen.
|
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. |
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. |
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:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz