AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Dynamischen Array über TCP
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamischen Array über TCP

Ein Thema von OrallY · begonnen am 10. Sep 2003 · letzter Beitrag vom 12. Sep 2003
Antwort Antwort
Benutzerbild von OrallY
OrallY

Registriert seit: 29. Apr 2003
268 Beiträge
 
#1

Dynamischen Array über TCP

  Alt 10. Sep 2003, 23:46
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 .
.oO'rallY
Linux is like a tipi: no gates, no windows and a gnu-eating apache inside...
  Mit Zitat antworten Zitat
Kamil

Registriert seit: 16. Aug 2002
178 Beiträge
 
#2

Re: Dynamischen Array über TCP

  Alt 11. Sep 2003, 14:10
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));
  Mit Zitat antworten Zitat
Benutzerbild von OrallY
OrallY

Registriert seit: 29. Apr 2003
268 Beiträge
 
#3

Re: Dynamischen Array über TCP

  Alt 11. Sep 2003, 14:34
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;
.oO'rallY
Linux is like a tipi: no gates, no windows and a gnu-eating apache inside...
  Mit Zitat antworten Zitat
Benutzerbild von OrallY
OrallY

Registriert seit: 29. Apr 2003
268 Beiträge
 
#4

Re: Dynamischen Array über TCP

  Alt 12. Sep 2003, 11:57
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?
.oO'rallY
Linux is like a tipi: no gates, no windows and a gnu-eating apache inside...
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#5

Re: Dynamischen Array über TCP

  Alt 12. Sep 2003, 17:20
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]
  Mit Zitat antworten Zitat
Benutzerbild von OrallY
OrallY

Registriert seit: 29. Apr 2003
268 Beiträge
 
#6

Re: Dynamischen Array über TCP

  Alt 12. Sep 2003, 17:39
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 .
.oO'rallY
Linux is like a tipi: no gates, no windows and a gnu-eating apache inside...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 Uhr.
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