![]() |
Dynamischen Array über TCP
Gibt es eine Möglichkeit einen dynamischen Array über TCP zu senden? Bis jetzt hab ichs leider noch nicht mal geschafft, einen statischen Array zu versenden :(.
|
Re: Dynamischen Array über TCP
Verschick doch die einzelnen Elemente des statischen bzw. dynamischen Arrays in einer Schleife.
Wo ist denn dein Problem? Oder bei TClientSocket: Socket.SendBuf(meinArray[0], length(meinArray)); |
Re: Dynamischen Array über TCP
Klar könnte ich die einzelnen Elemente per Schleife versenden. Aber ich hab halt nach einem einfach weg gesucht. Mein bisheriger Code:
Delphi-Quellcode:
In jedem der ReadBuffer-Fällen wird ist die MessageBox leer.type TTest = record s1, s2: string; end; TAoTest = array of TTest; procedure TForm1.Button1Click(Sender: TObject); var Test: TAoTest; begin SetLength(Test, 5); Test[3].s1 := 'Hallo'; with IdTCPClient1 do begin Connect; try WriteBuffer(Test[0], Length(Test)); finally Disconnect; end; end; end; procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var Test: TAoTest; begin with AThread.Connection do try SetLength(Test, 5); ReadBuffer(Test[0], Length(Test)); // ReadBuffer(Test[0], 5); // ReadBuffer(Test[0], SizeOf(Test)); ShowMessage(Test[3].s1); finally Disconnect; end; end; //edit: Naja, so klappts wenigstens:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Test: TAoTest; i: integer; begin SetLength(Test, 5); Test[3].s1 := 'Hallo'; with tc do begin Connect; try WriteLn(IntToStr(Length(test))); for i := 0 to High(Test) do WriteBuffer(Test[i], SizeOf(TTest)); finally Disconnect; end; end; end; procedure TForm1.tsExecute(AThread: TIdPeerThread); var Test: TAoTest; RText: string; i: integer; begin with AThread.Connection do try RText := ReadLn; SetLength(Test, StrToInt(RText)); for i := 0 to High(Test) do ReadBuffer(Test[i], SizeOf(TTest)); ShowMessage(Test[3].s1); finally Disconnect; end; end; |
Re: Dynamischen Array über TCP
Ich habe gerade festgestellt, dass die Methode auch nur lokal funktioniert. Sobald ich dann tatsächlich versuche von einem Rechner auf den anderen Rechner den Array zu schicken, erhalte ich einen EAccessViolation-Error, sobald ich auf den Array zugreifen will (in diesem Fall: ShowMessage(Test[3].s1);).
Weiß einer Rat? |
Re: Dynamischen Array über TCP
Der String wird von Delphi intern als eine Art Pointer behandelt, sprich: Der Text als solches liegt irgendwo im RAM, und die Variable "weiss" lediglich, wo. Solange nun dieser Pointer an die selbe Instanz des Programms versandt wird, ist die entsprechende Stelle im RAM weiterhin gültig, in einer anderen Instanz (geschweige denn auf einem anderen PC) jedoch nimmer....
Am einfachsten verwendest du ein ShortString: hier enthält die Variable auch gerade die Daten, ist allerdings auf 255 Zeichen limitiert. Oder aber du definierst ein entsprechendes Protokol, bei dem beispielsweise zuerst ein Word mit der Anzahl der nachfolgenden Zeichen übertragen wird, und anschliessend die Zeichen selber. Um bei einem String auf die "Daten" zuzugreifen, verwende: StringVar[1], oder als Pointer: @StringVar[1] |
Re: Dynamischen Array über TCP
Super! Danke, es klappt. Ich hatte schon die Vermutung, dass mein Problem bei den Referenzen/Pointern liegt. Nur hab ich da eigentlich nicht an die Strings gedacht.
Danke vielmals ;). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 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