Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Dynamischen Array über TCP (https://www.delphipraxis.net/8731-dynamischen-array-ueber-tcp.html)

OrallY 10. Sep 2003 23:46


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 :(.

Kamil 11. Sep 2003 14:10

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));

OrallY 11. Sep 2003 14:34

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:

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;
In jedem der ReadBuffer-Fällen wird ist die MessageBox leer.

//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;

OrallY 12. Sep 2003 11:57

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?

Basilikum 12. Sep 2003 17:20

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]

OrallY 12. Sep 2003 17:39

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