Entwickler-Ecke
Internet / Netzwerk - Dynamischen Array versenden
O'rallY - Mi 10.09.03 23:02
Titel: Dynamischen Array versenden
Gibt es eine Möglichkeit, einen dynamischen Array über TCP zu versenden?
O'rallY - Mi 10.09.03 23:40
Habs grad selber herausgefunden. Hab vorhin nur die falsche Methode verwendet. Ich habs jetzt einfach mit dem WriteBuffer-Befehl realisiert (Indy).
O'rallY - Mi 10.09.03 23:47
Ups, zu früh gefreut. Ich hab das ganze nur lokal ausprobiert und anscheinend hab ich einfach nur die Referenz verschickt. Da die Referenz aber auf dem gleichen Rechner natürlich auch auf die gleichen Daten gezeigt hat, ging es.
Also, meine Frage steht noch: Gibt es eine Möglichkeit einen dynamischen Array über TCP zu verschicken?
UGrohne - Do 11.09.03 07:44
Ich bin da nicht so fit drin, aber ich denke, ich würde das ganze in XML verpacken und das dann rausschicken.
barfuesser - Do 11.09.03 08:58
Wie sieht denn Dein WriteBuffer-Befehl aus?
barfuesser
O'rallY - Do 11.09.03 15:38
Das hier ist mein bisheriger Code.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| 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)); ShowMessage(Test[3].s1); finally Disconnect; end; end; |
In jedem der ReadBuffer-Fällen ist die MessageBox leer.
//edit: Na wenigstens klappts so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| 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; |
O'rallY - Fr 12.09.03 12:56
Ich habe gerade festgestellt, dass die Methode 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?
//edit: Mit der Schleifenmethode kann man zumindest statische Arrays verschicken, aber mit dynamischen hab ichs immer noch nicht geschafft :(.
O'rallY - Fr 12.09.03 18:45
Problem gelöst. Basilikum ausm DP hat mich darauf hingewiesen.
Das ganze ist an dem Typ string gescheitert, der ja nichts anderes als ein Pointer ist. Verwendet man in der Struktur ShortString, ist das Prioblem gelöst.
Beim string wurde immer nur die Adresse der Daten geschickt, nicht aber die Daten selber.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!