Autor Beitrag
HaCkAttaCk2001
Hält's aus hier
Beiträge: 6

WinXP
Delphi 6 Prof
BeitragVerfasst: Di 02.03.04 22:01 
Hi.

Ich habe ein Problem mit einer ProgressBar...

Ich habe ein Programm geschrieben, mit dem man eine einzelne Datei übers Internet versenden kann. Verbindung etc. klappt super und derjenige, der den Server aufmacht, kann auch eine ProgressBar sehen, da man dort die eingehende Dateimenge abfragen kann. Beim Client geht das allerdings nicht... und ich habe keine Ahnung, wie ich auch dem Client eine Fortschrittsanzeige gönnen kann .

Der Server empfängt hier die Dateien (er macht nur die Ports auf seinem Rechner auf). Der Client sendet per Buttonklick die Datei.

Das ganze ist mit 4 Komponenten gelöst (bitte keine Kommentare wie: "Hach ist das umständlich gemacht *blablabla* *schwafel*" - ich weiß, dass ich kein Programmiergenie bin). Das sind die Komponenten FileSocket, FileSocketServer, Server und Client.

Ich habe versucht die Progressbar für den Client so zu lösen:

Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var 
  buffer : array[0..999999] of char; //ist global deklariert 

{ Senderoutinen etc. } 

procedure TForm1.FileSocketRead(Sender: TObject; Socket: TCustomWinSocket); 
var 
SendLen : integer; 
begin 
SendLen := socket.SendBuf(Buffer, Sizeof(Buffer)); 
ProgressBar1.StepBy(SendLen); 
end;



Doch es scheint gar nicht anzuspringen. Wieso? Hab ich es nur in die falsche Prozedur geschrieben?

Danke für eure Hilfe! Wer will, kann mich auch anmailen, dann sende ich euch den ganzen Code.

Edit: Die FAQ hat mir leider nix gebracht... denn da fehlt die Auswertung! Und genau die will bei mir ja nicht klappen ^^ .

C ya!

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt
Ex0rzist
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 550

Win XP Prof.
Mandrake 10.0

D6
BeitragVerfasst: Mi 03.03.04 13:14 
Hi.

FileSocketRead springt nur an, wenn dieser Socket Daten empfängt.
Wie versendest du denn deine Daten?

_________________
If accidentally read, induce vomitting.
HaCkAttaCk2001 Threadstarter
Hält's aus hier
Beiträge: 6

WinXP
Delphi 6 Prof
BeitragVerfasst: Mi 03.03.04 15:25 
Hi.

Das Senden der Daten wird über einen Buttonklick eingeleitet:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure TForm1.Button11Click(Sender: TObject);
var
FName : string;
Size : integer;
begin
if (client.Active = true) and (filelistbox1.ItemIndex > -1) then
 begin
  FName :=  filelistbox1.FileName;
  Stream := TFileStream.Create(Fname,fmopenread);
  Stream.Position := 0;
  Size := Stream.Size;
  memo2.Lines.add('Bereite Datentransfer vor...');
  memo2.lines.add('Sende Dateigröße von ' + ExtractFileName(Fname) + '...');
  Client.Socket.SendText('!SIZE' + inttostr(Size));
  filesize.Text := inttostr(Size);
  Stream.Free;
  sleep(2000);
  Client.Socket.SendText('!FILE' + ExtractFileName(Fname));
  memo2.lines.add('Sende Dateiname von ' + ExtractFileName(Fname) + '...');
  filename.Text := ExtractFileName(FName);
  sleep(2000);
  FileSocket.Host := edit2.text;
  FileSocket.Open;

  ProgressBar1.Max := Size; //für den Client die ProgressBar auf den Max-Wert setzen - <span style="color: darkred">erster Ansatz um die ProgressBar zu fixen</span>
 end
 else
  Application.MessageBox('Sie müssen vor dem Senden einer Datei erst mit einem Empfangs-Server verbunden sein!','Hinweis');
end;


Hier ist das ganze mit FileSocket (hoffe, ich hab das richtige rausgepickt):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.FileSocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
FName : String;
begin
memo2.lines.add('Mit Client verbunden.');
FName :=  filelistbox1.FileName;
FileSocket.Socket.SendStream(TFileStream.Create(Fname,fmopenread));
memo2.Lines.add('Sende Datei ' + ExtractFileName(FName) + '...');
end;


Wie bekomm ich nun aus dem FileSocket raus, welche Datenmengen schon übertragen wurden?

C ya :) .
Ex0rzist
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 550

Win XP Prof.
Mandrake 10.0

D6
BeitragVerfasst: Mi 03.03.04 17:58 
Ich habe mir das Ganze mal angeschaut und bin zu dem Schluss gekommen, dass es das gar nicht so einfach ist. :wink:
Wenn du Socket.SendStream verwendest, hast du keine (mir ersichtliche) Möglichkeit herauszufinden, was schon gesendet wurde.
Bei Socket.SendBuf() wäre das schon eher möglich, da du dort als Rückgabewert die Anzahl der gesendeten Daten erhältst.

Alternativ könntest du dir auch vom Server die Anzahl der empfangen Bytes schicken lassen.

Jetzt musst du nur entscheiden, ob du lieber auf die Progressbar verzichten oder den Umweg gehen willst. :?

_________________
If accidentally read, induce vomitting.
HaCkAttaCk2001 Threadstarter
Hält's aus hier
Beiträge: 6

WinXP
Delphi 6 Prof
BeitragVerfasst: Mi 03.03.04 19:09 
Hi.

Da werd ich wohl den Umweg gehen müssen und ein neues Command inplementieren müssen... Das wird Arbeit :shock: *ächz*...

Gut, wenn sonst niemand einen Weg kennt... :|



C ya!
HaCkAttaCk2001 Threadstarter
Hält's aus hier
Beiträge: 6

WinXP
Delphi 6 Prof
BeitragVerfasst: Mi 03.03.04 19:45 
Hi.

Hab da grad nen Geistesblitz gehabt... :D . Hab das nun so gemacht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
Data : String;
begin
Data := Socket.ReceiveText;
If Data = '!DONE' then
begin
memo2.lines.add('Datei-Übertragung erfolgreich.');
Application.MessageBox('Die Dateiübertragung wurde erfolgreich abgeschlossen.','Hinweis');
FileSocket.Close;
end;


// FIX?
If Data = '!100' then ProgressBar1.StepBy(100);
if ProgressBar1.Position >= GlobalSize then ProgressBar1.Position := 0;
// FIX?

end;


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
procedure TForm1.FileSocketServerClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  //buffer : array[0..999999] of char; //unsigned char
  FilePath : string;
  IncommingLen, RecievedLen : integer;
begin
FilePath := ExtractFilePath(Application.ExeName);
IncommingLen := socket.ReceiveLength;
//recieve the length of the bytes
 while IncommingLen > 0 do
  begin
  RecievedLen := socket.ReceiveBuf(Buffer, Sizeof(Buffer));
  //get the buffer with the bytes from the files
  if RecievedLen <= 0 then
   begin
    Break
    //if there are no more bytes in the file then
    //exit this while statement (break)
   end
   else
    Stream.Write(Buffer,RecievedLen);
    ProgressBar1.StepBy(RecievedLen);
    //if the buffer has data, write to the file
    if Stream.Size >= strtoint(FileSize.Text) then
    //if the new file is the same amount of bytes as
    //the original then send the 'DONE' command to the client
     begin
     Server.Socket.Connections[0].SendText('!DONE');
     Application.MessageBox('Die Dateiübertragung wurde erfolgreich abgeschlossen.','Hinweis');
     log('Datei erfolgreich empfangen!');
     Stream.Free;
     filesize.Clear;
     filename.Clear;
     FileSocketServer.Close;
     progressbar1.Position := 0;
     break
     end;
 
    // FIX? 
    if ((Stream.Size div 100)*100) = Stream.Size then Server.Socket.Connections[0].SendText('!100');
    // FIX?

  end;
end;


Ich erhoffe mir dadurch, dass, sobald 100 Bytes versendet wurden, der Server die Message '!100' an den Client schickt und der der ProgressBar 100 Schritte hinzuzählt (die Bar ist genauso lang, wie die Datei Bytes hat).


C ya!