AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi 2 Codes in clientsocketread vereinen ?
Thema durchsuchen
Ansicht
Themen-Optionen

2 Codes in clientsocketread vereinen ?

Ein Thema von Vader · begonnen am 1. Mai 2004 · letzter Beitrag vom 8. Mai 2004
Antwort Antwort
Seite 1 von 2  1 2      
Vader

Registriert seit: 6. Mai 2003
804 Beiträge
 
Delphi 6 Enterprise
 
#1

2 Codes in clientsocketread vereinen ?

  Alt 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) = '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;
ist das irgenwie möglich,ohne indy bzw ftp ??


mfg vader

[edit=MrSpock]Code Tags durch Delphi Tags ersetzt. Mfg, MrSpock[/edit]
  Mit Zitat antworten Zitat
Vader

Registriert seit: 6. Mai 2003
804 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: 2 Codes in clientsocketread vereinen ?

  Alt 7. Mai 2004, 19:15
kann mir da keiner helfen ?

mfg vader
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: 2 Codes in clientsocketread vereinen ?

  Alt 7. Mai 2004, 19:26
Moin!

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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: 2 Codes in clientsocketread vereinen ?

  Alt 7. Mai 2004, 19:31
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...
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Vader

Registriert seit: 6. Mai 2003
804 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: 2 Codes in clientsocketread vereinen ?

  Alt 8. Mai 2004, 12:03
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
  Mit Zitat antworten Zitat
Vader

Registriert seit: 6. Mai 2003
804 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: 2 Codes in clientsocketread vereinen ?

  Alt 8. Mai 2004, 12:30
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
  Mit Zitat antworten Zitat
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
Vader

Registriert seit: 6. Mai 2003
804 Beiträge
 
Delphi 6 Enterprise
 
#8

Re: 2 Codes in clientsocketread vereinen ?

  Alt 8. Mai 2004, 13:18
hallo Sir Thornberry,

er schreit beim compillieren bei der zeile:
Code:
ClientSocket2Read(Sender);

[Fehler] Unit1.pas(382): Nicht genügend wirkliche Parameter

mfg vader
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: 2 Codes in clientsocketread vereinen ?

  Alt 8. Mai 2004, 13:22
Sorry, hatte nen fehler drin (habs oben ausgebessert)
Der Aufruf muss dann so aussehen
  ClientSocket2Read(Sender, Socket);
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Vader

Registriert seit: 6. Mai 2003
804 Beiträge
 
Delphi 6 Enterprise
 
#10

Re: 2 Codes in clientsocketread vereinen ?

  Alt 8. Mai 2004, 14:09
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz