Registriert seit: 6. Mai 2003
804 Beiträge
Delphi 6 Enterprise
|
2 Codes in clientsocketread vereinen ?
1. Mai 2004, 20:12
hallo,
eine frage: kann man diese beiden code's in einen
clientsocketread vereinen ?????
datei einlesen:
Delphi-Quellcode:
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;
end;
treeview einlesen:
Delphi-Quellcode:
public
daten:boolean;
pos,size:integer;
mem:TMemoryStream;
{ Public-Deklarationen }
procedure TForm1.ClientSocket1Read(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) = 'Tree' then //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;
ist das irgenwie möglich,ohne indy bzw ftp ??
mfg vader
[edit=MrSpock]Code Tags durch Delphi Tags ersetzt. Mfg, MrSpock[/edit]
|
|
Zitat
|