![]() |
2 Codes in clientsocketread vereinen ?
hallo,
eine frage: kann man diese beiden code's in einen clientsocketread vereinen ????? datei einlesen:
Delphi-Quellcode:
treeview einlesen:
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;
Delphi-Quellcode:
ist das irgenwie möglich,ohne indy bzw ftp ??
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; mfg vader [edit=MrSpock]Code Tags durch Delphi Tags ersetzt. Mfg, MrSpock[/edit] |
Re: 2 Codes in clientsocketread vereinen ?
kann mir da keiner helfen ?
mfg vader |
Re: 2 Codes in clientsocketread vereinen ?
Moin!
Zitat:
Verfolge den Vorschlag von PapaNappa weiter, was anderes würde hier auch nicht rauskommen... MfG Muetze1 |
Re: 2 Codes in clientsocketread vereinen ?
ich versteh das problem nicht so rechr - eigentlich hätte man ja auf die frage einfach mit "ja" antworten können denn du wolltest ja nur wissen ob es möglich ist.
Ich würde einfach den oberen abschnitt nehmen und am ende davon den zweiten aufrufen. Im zweiten allerdings nicht mit Socket.RecieveText arbeiten sondern den Text schon in der ersten procedure holen und in einer variablen zwischen speichern so das die zweite procedure die daten nutzen kann. Wobei es eigentlich auch funktionieren müsste einfach am ende des ersten codeabschnittes den zweiten aufzurufen... |
Re: 2 Codes in clientsocketread vereinen ?
hallo,
du schreibst am ende des ersten abschnittes den zweiten aufrufen, das wäre in hammer wenn das gehen würde aber ich weiß nicht wie ich die aufrufen soll. könntest du mir einen code posten wäre zu tiefst verbunden mfg vader |
Re: 2 Codes in clientsocketread vereinen ?
hallo muetze,
frage? kann ich das bei meinen client gleich so reinschreiben bei einer procedure ohne das ich im objektinspektor was anklicke ich meine nach dem procedurename >"(Sender: TObject; Socket: TCustomWinSocket);" jetzt hab ich ja mit dem tipp vom pappanappa 2 eigene proceduren gemacht.
Code:
wo ich die socketreadtree in private decklariert mußte weil er
procedure socketreadfile (Sender: TObject;
Socket: TCustomWinSocket); und procedure tform1.socketreadtree (Sender: TObject; Socket: TCustomWinSocket); sonst sie nicht erkann hat. nur ich hänge jetzt bei diesem verdammten aufruf im wirklichen clientsocketread
Code:
er schreit immer zu wenig parameter.
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket); begin if status=0 then SocketReadTree (self) else if status=1 then SocketRedFile (self) end; mfg vader |
Re: 2 Codes in clientsocketread vereinen ?
Du musst den zweiten sourceabschnitt einfach umbenennen und dann sollte es so ungefähr aussehen
Delphi-Quellcode:
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
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) = '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; |
Re: 2 Codes in clientsocketread vereinen ?
hallo Sir Thornberry,
er schreit beim compillieren bei der zeile:
Code:
ClientSocket2Read(Sender);
[Fehler] Unit1.pas(382): Nicht genügend wirkliche Parameter mfg vader |
Re: 2 Codes in clientsocketread vereinen ?
Sorry, hatte nen fehler drin (habs oben ausgebessert)
Der Aufruf muss dann so aussehen
Delphi-Quellcode:
ClientSocket2Read(Sender, Socket);
|
Re: 2 Codes in clientsocketread vereinen ?
hallo SirThornberry.
danke der aufruf hat funktioniert, den befehl für die datei senden über das echte clientsocketread funzt wunderbar aber wenn ich den server den befehl schicke die daten des tree's zu streamen kommt jede menge von zugriffsverletzungen das hat was zu tun was du geschrieben hast müßte den zweiten abschnitt noch verändern ( Im zweiten allerdings nicht mit Socket.RecieveText arbeiten sondern den Text schon in der ersten procedure holen und in einer variablen zwischen speichern so das die zweite procedure die daten nutzen kann.) nur weiß ich nicht wie ich das umprogrammieren soll wäre dir sehr dankbar wenn du mir wieder einen code posten könntest. mfg vader |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz