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.