Einzelnen Beitrag anzeigen

Benutzerbild von runningsoft
runningsoft

Registriert seit: 8. Okt 2004
Ort: Bernau
108 Beiträge
 
Delphi 10.4 Sydney
 
#1

Stringlist mit SendStream versenden

  Alt 10. Feb 2017, 22:59
Hallo zusammen,

ich sitze schon ewig über der Aufgabe einen Record, der neben einigen festen Strings und Integerwerten auch eine Stringlist enthält, über TClientSocket bzw. TServerSocket zu versenden bzw. zu empfangen. Leider bisher ohne Erfolg. Lasse ich die Stringliste testweise aus meinem Record heraus, funktioniert das versenden des Records vom Client an den Server wunderbar. Versende ich das ganze mit der Stringliste gibts am Server sofort eine Exception, sobald ich versuche auf den Inhalt der übertragenen Stringliste zuzugreifen.

Hier mal ein bisschen Code:
Delphi-Quellcode:
type
CustomRec = record
   RecID : Integer;
   RecVorgang : String[15];
   RecStatus: integer;
   ....
   RecTNListe: TStringList;
   end;
Erstellen und versenden des Records am Client:
Delphi-Quellcode:
procedure TClientForm.BitBtn1Click(Sender: TObject);
var MyTNList : TStringList;
    MStr : TMemoryStream;

begin
....
Finalize(Rec); //Record zur Sicherheit komplett leeren
Rec.RecListe := TStringList.Create; //Stringliste des Records erzeugen
with Rec do
   begin
   RecID := GetClientID;
   RecVorgang := 'Irgendwas';
   RecStatus := 2;
   .....
   RecTNListe.Text := MyTNList.Text; //MyTNList wurde vorher created und enthält Daten
   end;
//als Stream versenden
MStr := TMemoryStream.Create;
  try
  MStr.Write(Rec,SizeOf(Rec));
  MStr.Position := 0;
  Form5.ClientSocket1.Socket.SendStream(MStr);
  finally
  if Assigned(MStr) then
    begin
    MStr := nil;
    MStr.Free;
    end;
  end;
end;
Und hier noch die Empfangsprozedur am Server:
Delphi-Quellcode:
procedure TServerForm.ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);
var ....
    iLen: integer;
    Rec : CustomRec;
    Bfr : Pointer;
begin
Finalize(Rec);
Rec.RecListe := TStringList.Create; //Stringliste des Records erzeugen
//Länge des Streams empfangen
iLen := Socket.ReceiveLength;
//Arbeitsspeicher reservieren
GetMem(Bfr, iLen);
//Stream empfangen und in Arbeitsspeicher schreiben
   try
   Socket.ReceiveBuf(Bfr^, iLen);
   //Position auf das Ende des Streams setzen
   MStream.Seek(0,soFromEnd);
   MStream.Write(Bfr^, iLen);
   finally
   FreeMem(Bfr);
   end;
MStream.Seek(0,soFromEnd);
//an erste Position gehen
MStream.Position := 0;
//Buffer in Record einlesen
MStream.ReadBuffer(Rec,iLen);

//wenn ich jetzt auf die Stringliste des Records zugreifen will, gibts eine Exception
//die Anzeige der Strings oder Integerwerte des Records funktioniert dagegen problemlos
//lasse ich Server und Client testweise auf ein und dem selben Rechner laufen, funktioniert es wunderbar
showmessage(Rec.RecTNListe.Strings[0]);
...
end;
Es scheint so, dass ich nicht wirklich die Stringliste per Sendstream übertrage, obwohl diese am Client definitv in den Record geschrieben wird, sondern nur Pointer auf die Adressen der Daten der Stringliste. Da der (entfernte) Server diese Adressen des Clients nicht kennt, kommt die Exception.

Die Frage ist also, wie bekomme ich den INHALT der Stringliste übertragen und auch wieder ausgelesen?

Danke schon mal für Eure Mithilfe.
  Mit Zitat antworten Zitat