Autor Beitrag
O'rallY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Mi 10.09.03 23:02 
Gibt es eine Möglichkeit, einen dynamischen Array über TCP zu versenden?

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
O'rallY Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: 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).

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
O'rallY Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: 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?

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 324



BeitragVerfasst: Do 11.09.03 08:58 
Wie sieht denn Dein WriteBuffer-Befehl aus?

barfuesser
O'rallY Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Do 11.09.03 15:38 
Das hier ist mein bisheriger Code.
ausblenden volle Höhe 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));
      // ReadBuffer(Test[0], 5);angezeigt 
      // ReadBuffer(Test[0], SizeOf(Test));
      ShowMessage(Test[3].s1); 
    finally 
      Disconnect; 
    end
end;


In jedem der ReadBuffer-Fällen ist die MessageBox leer.

//edit: Na wenigstens klappts so:
ausblenden volle Höhe 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;

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
O'rallY Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



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

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
O'rallY Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



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

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...