WriteLn / ReadLn Problem (Indy)

Sebastian Wramba

Erfahrenes Mitglied
Hi zusammen,

ich schon wieder... habe einen Server und einen Client, die per Indy-TCP verbunden sind. Verbindung steht, etc. alles wunderbar. Nun soll der Server aber die 4 Zeilen, die er in der Listbox hat, an den Client schicken, wenn dieser diese Daten anfordert. Es funktioniert fast, aber leider nur fast. Es wird nur die erste Zeile in die Liste eingetragen. Woran liegt's?

Server:

Code:
procedure TForm1.TCPServerExecute(AThread: TIdPeerThread);
var i: integer;
begin
with AThread.Connection do
  begin
    if(ReadLn = 'GetFile') then
    begin
     for i := 0 to itemslist.Items.Count do
      begin
        WriteLn(itemslist.Items[i]);
      end;
    end;
  end;

end;

Client:

Code:
procedure TForm1.btGetListClick(Sender: TObject);
var StringList: TStrings;
begin
 StringList := TStringList.Create;
 with TCPClient do begin
        WriteLn('GetFile');
        StringList.Add(ReadLn);
        lstMain.Items.Assign(StringList);
 end;
end;

Danke im Voraus,
MfG Sebastian
 

Arne Buchwald

Erfahrenes Mitglied
Füge die Items vor dem Senden in einen String getrennt durch einen Trennzeichen zusammen, versende den String und splitte ihn auf Empfängerseite wieder. So geht's auf jeden Fall.
 

Sebastian Wramba

Erfahrenes Mitglied
Original geschrieben von Arne Buchwald
[...] und splitte ihn auf Empfängerseite wieder. So geht's auf jeden Fall.

... uuund wie geht das? :)
Einen Befehl dafür, scheint's ja in Delphi nicht zu geben. Wie splitte ich also einen String nach dem Schema "Eintrag1|Eintrag2|Eintrag3" in ein Array auf?

MfG Sebastian
 

Maximka

Erfahrenes Mitglied
Server:
Code:
procedure TForm1.TCPServerExecute(AThread: TIdPeerThread);
var i: integer;
begin
with AThread.Connection do
  begin
    if(ReadLn = 'GetFile') then
    begin
     
     /// hier noch die anzahl der items schreiben
     WriteLn(itemslist.Items.Count);
     
     for i := 0 to itemslist.Items.Count do
      begin
        WriteLn(itemslist.Items[i]);
      end;
    end;
  end;
end;

Client:
Code:
procedure TForm1.btGetListClick(Sender: TObject);
var StringList: TStrings;
var i,ItemCount: Integer;
begin
 StringList := TStringList.Create;
 with TCPClient do begin
        WriteLn('GetFile');
        
        /// hier lesen wir wieviel items es gewesen sind
        /// hab kein Delphi zur Hand, kann nicht sagen wie es genau mit Integer funktioniert
        ReadLn(ItemCount);
        for i := 0 to ItemCount do
        begin
          StringList.Add(ReadLn);
        end;
        
        lstMain.Items.Assign(StringList);
 end;
end;