Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi 2 Codes in clientsocketread vereinen ? (https://www.delphipraxis.net/21368-2-codes-clientsocketread-vereinen.html)

Vader 1. Mai 2004 19:12


2 Codes in clientsocketread vereinen ?
 
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]

Vader 7. Mai 2004 18:15

Re: 2 Codes in clientsocketread vereinen ?
 
kann mir da keiner helfen ?

mfg vader

Muetze1 7. Mai 2004 18:26

Re: 2 Codes in clientsocketread vereinen ?
 
Moin!

Zitat:

Zitat von Vader
kann mir da keiner helfen ?

mfg vader

Bei beiden Foren hilft dir keiner...

Verfolge den Vorschlag von PapaNappa weiter, was anderes würde hier auch nicht rauskommen...

MfG
Muetze1

SirThornberry 7. Mai 2004 18:31

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...

Vader 8. Mai 2004 11:03

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

Vader 8. Mai 2004 11:30

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:
procedure socketreadfile (Sender: TObject;
  Socket: TCustomWinSocket);

und

procedure tform1.socketreadtree (Sender: TObject;
  Socket: TCustomWinSocket);
wo ich die socketreadtree in private decklariert mußte weil er
sonst sie nicht erkann hat.


nur ich hänge jetzt bei diesem verdammten aufruf im wirklichen
clientsocketread
Code:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  if status=0 then
  SocketReadTree (self)
else if status=1 then
  SocketRedFile (self)

end;
er schreit immer zu wenig parameter.


mfg vader

SirThornberry 8. Mai 2004 11:34

Re: 2 Codes in clientsocketread vereinen ?
 
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) = '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;
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

Vader 8. Mai 2004 12:18

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

SirThornberry 8. Mai 2004 12:22

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);

Vader 8. Mai 2004 13:09

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

Vader 8. Mai 2004 13:10

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

Vader 8. Mai 2004 13:35

Re: 2 Codes in clientsocketread vereinen ?
 
hallo SirThornberry,

ja ich hab's es funzt,
danke noch einmal für deine hilfe mit deinen gedankenstoß hab ich
es ausprogrammiert :)

mfg vader


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 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