Einzelnen Beitrag anzeigen

Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: 2 Codes in clientsocketread vereinen ?

  Alt 8. Mai 2004, 12:34
Du musst den zweiten sourceabschnitt einfach umbenennen und dann sollte es so ungefähr aussehen
Delphi-Quellcode:
public
  daten:boolean;
    pos,size:integer;
    mem:TMemoryStream;


var
  Form1: TForm1;
  FStream: TFileStream;


procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
  iLen: Integer;
  Bfr: Pointer;
begin
  iLen := Socket.ReceiveLength;
  GetMem(Bfr, iLen);
  try
    Socket.ReceiveBuf(Bfr^, iLen);
    FStream.Write(Bfr^, iLen);
  finally
    FreeMem(Bfr);
  end;
  ClientSocket2Read(Sender, Socket);
end;


procedure TForm1.ClientSocket2Read(Sender: TObject; Socket: TCustomWinSocket);
var a:array[0..4096]of byte;
      buf:pointer;
      i:integer;
      s:string;
begin
   if not daten then
   begin
     s := Socket.ReceiveText; //Text empfangen
     if Copy(s,1,4) = 'Treethen //wurde der "Tree" gesendet?
//in der alten Version stand hier 'tree' - kein wunder, dass nie was angekommen is ^^
     begin
        delete(s,1,5); // den Text löschen
        for i := 1 to length(s) do //#13#10 suchen
          if (length(s) > i) and
             ((s[i] = #13) and (s[i+1] = #10)) then break;
        if i = length(s) then exit; //nicht gefunden --> abbrechen
// es könnte theoretisch sein, dass auch der string in mehreren packeten ankommt, es ist aber sehr unwahrscheinlich, deshalb hab ich darauf verzichtet. bei bedarf einfach genau so wie mit dem stream verfahren...
        size := StrToint(copy(s,1,i-1)); //größe abspeichern
        daten := true; //daten kommen jetzt!
        mem.Clear; //stream löschen
        delete(s,1,i+1); //alles bis zum #13#10 aus dem string löschen
        mem.Position := 0;
        for i := 1 to length(s) Do //alles übriggebliebene in den stream speichern
          mem.Write(s[i],1);
//sollte eigentlich auch mit der alten Methode gehen, kannst ja ausprobieren, wenns dir nicht gefällt ;-P
        pos := length(s); //position festsetzen
        if pos >= size then //schon alle bytes empfangen? (triff ein, wenn alles in einem packet gesendet wurde)
        begin
          daten := false; //keine daten mehr!
          mem.position := 0; //stream zurücksetzen
          pos := 0; //anzahl der empfangenen bytes zurücksetzen
          TreeView1.Items.Clear;
          TreeView1.LoadFromStream(mem); //empfangenen tree ins treeview laden
       end;
     end;
   end
   else
   begin
     buf := @a;
     i := Socket.ReceiveBuf(buf^,4096); //daten empfangen
     mem.write(buf^,i); //in stream speichern
     pos := pos + i; //anzahl der empfangenen bytes erhöhen
     if pos >= size then //schon alle bytes empfangen?
     begin
        daten := false; //keine daten mehr!
        mem.position := 0; //stream zurücksetzen
        pos := 0; //anzahl der empfangenen bytes zurücksetzen
        TreeView1.Items.Clear;
        TreeView1.LoadFromStream(mem); //empfangenen tree ins treeview laden
     end;
   end;
end;
natürlich die zweite procedure noch bissl abändern damit du da nicht schon wieder von Clientsocket liest - am besten du liest schon im ersten abschnit aus und packst es in ne variable
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat