Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdFTP + progressbar wie ?! (https://www.delphipraxis.net/62731-idftp-progressbar-wie.html)

ghost007 8. Feb 2006 17:49


IdFTP + progressbar wie ?!
 
Hallo,
ich weiß das es hier schon mehrere posts zu diesem thema gibt, aber ich werde aus keinem von ihnen schlau. :( :wall:
Also, ich habe folgendes problem:

Ich habe einen IdFTP und will das der downloadvortschritt in einer progressbar dargestellt wird.
1.Wo finde ich die progressbarkomponente in delphi?
2.Wie stelle ich den fortschnitt dar?

-=wWw=- AK23 8. Feb 2006 17:53

Re: IdFTP + progressbar wie ?!
 
Ich weiß ja nu nicht obs wirklich weiterhilft, aber guck mal hier.

Da geht es um idHTTP Downloads mit fortschrittsanzeige, aber ich denke mal das lässt sich umschreiben.

ghost007 8. Feb 2006 18:03

Re: IdFTP + progressbar wie ?!
 
Zitat:

Zitat von -=wWw=- AK23
Ich weiß ja nu nicht obs wirklich weiterhilft, aber guck mal hier.

Da geht es um idHTTP Downloads mit fortschrittsanzeige, aber ich denke mal das lässt sich umschreiben.

hm... is ein bischen komisch :gruebel:
Gibt es denn keinen hier, der sowas schon selber programmiert hat?

marabu 8. Feb 2006 19:17

Re: IdFTP + progressbar wie ?!
 
Hallo,

die ProgressBar-Komponente findest du z.B. wenn du den Menüeintrag "Komponente | Palette konfigurieren..." aktivierst. Wähle die Gesamtansicht und sortiere die Liste der Komponenten nach Namen. Neben dem Namen der Komponente (TProgressBar) liest du dann die Palettenseite, auf der du die Komponente abholen kannst.

Die Fortschrittsanzeige ist einfach zu realisieren, wenn der FTP-Server die Größe beim GET übermittelt:

Delphi-Quellcode:
procedure TDemoForm.FTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
  with ProgressBar do
  begin
    Max := AWorkCountMax;
    Position := 0;
    Visible := true;
  end;
end;

procedure TDemoForm.FTPWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  with ProgressBar do
    Position := AWorkCount;
end;

procedure TDemoForm.FTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
  with ProgressBar do
    Visible := false;
  ShowMessage('fettich');
end;
Wenn die Größe nicht übermittelt wird (AWorkCountMax = 0) dann musst du dir die Größe aus dem directory listing besorgen.

Grüße vom marabu

ghost007 8. Feb 2006 20:24

Re: IdFTP + progressbar wie ?!
 
hm... ich hab es jetzt mal versucht , wie es marabu vorgeschlagen hat, jedoch wird bei mir in der progressbar kein vortschritt angezeigt :( :gruebel:

marabu 8. Feb 2006 20:27

Re: IdFTP + progressbar wie ?!
 
Hast du denn überprüft, ob der Server dir bei Aufnahme der Übertragung im event handler OnWorkBegin() die Größe des Datenstroms übermittelt - oder 0?

marabu

ghost007 8. Feb 2006 20:36

Re: IdFTP + progressbar wie ?!
 
Zitat:

Zitat von marabu
Hast du denn überprüft, ob der Server dir bei Aufnahme der Übertragung im event handler OnWorkBegin() die Größe des Datenstroms übermittelt - oder 0?

Ich habe mal eine label gemacht um den wert zu überprüfen, ich erhalte den wert 0.
Wie kann ich dieses problem umgehen oder lösen?

HILFE!!!

ghost007 9. Feb 2006 17:53

Re: IdFTP + progressbar wie ?!
 
Hallo,
ist denn hier keiner der mir weiterhelfen kann?
:( :gruebel: :wall: :duck:

-=wWw=- AK23 9. Feb 2006 17:57

Re: IdFTP + progressbar wie ?!
 
die sind hier ein wenig antwortfaul :wall:

sorry, ich kann dir nicht weiterhelfen

Luckie 9. Feb 2006 17:58

Re: IdFTP + progressbar wie ?!
 
Zitat:

Zitat von ghost007
Hallo,
ist denn hier keiner der mir weiterhelfen kann?

Hat marabu doch geschrieben:

Zitat:

Zitat von marabu
Wenn die Größe nicht übermittelt wird (AWorkCountMax = 0) dann musst du dir die Größe aus dem directory listing besorgen.


ghost007 9. Feb 2006 21:54

Re: IdFTP + progressbar wie ?!
 
aha, da stellen sich mir nur 2 fragen. :gruebel:
1.Wie komm ich an das directory listing?
2.Wie bekomme ich die größe daraus?

:roll:

Luckie 9. Feb 2006 22:55

Re: IdFTP + progressbar wie ?!
 
Schon mal die Demos zu den Indy Komponenten angeguckt? Da sollte ein kompletter FTP Client dabei sein.

ghost007 9. Feb 2006 23:29

Re: IdFTP + progressbar wie ?!
 
Ja, hab ich , aber da kommt dann ein fehler das eine unit, die unter uses eingetragen ist, mit einer anderen version kompiliert wurde....

Luckie 9. Feb 2006 23:32

Re: IdFTP + progressbar wie ?!
 
Ja und? Du sollst dir ja nur die entsprechenden Stellen im Sourcecode angucken. Kompilieren können musst du doch gar nicht.

marabu 10. Feb 2006 06:52

Re: IdFTP + progressbar wie ?!
 
Guten Morgen.

Bei einer vorkonfigurierten FTP Client-Komponente (host, username, password) hilft manchmal auch schon das hier weiter:

Delphi-Quellcode:
function FTPSize(ftp: TIdFTP; const fn: TFileName): Int64;
begin
  ftp.Connect(true, -1);      
  try
    try
      Result := ftp.Size(fn);
    except
      Result := 0;
    end;
  finally
    ftp.Disconnect;            
  end;
end;
Grüße vom marabu

TheProfi 4. Mai 2010 13:51

Re: IdFTP + progressbar wie ?!
 
Hi,

ich habs so gelöst und es geht. Dieser Programmcode stammt von meinem Programmupdater (D2010, akt. Indy 10.5.7).
Mit dieser Function lade ich alle Dateien runter die in einem bestimmten Verzeichnis liegen.

Version : ist halt ein Verzeichnis auf dem FTPServer
Pfad : ist halt ein weiteres Verzeichnis auf dem FTPServer
LStatus1 : gibt die als Text "Download Datei x von y"
LStatus2 : gibt die aktuelle Datei mit Dateigöße zurück
PB : 0 bis Anzahl Dateien im Verzeichnis
PB2 : aktueller Downloadverlauf der jeweiligen Datei

Delphi-Quellcode:
Function DownloadFiles(Version,pfad : String; var ftp : TIdFTP; var LStatus1,LStatus2 : TADVSmoothLabel; var pb,pb2 : TADVProgressBar) : boolean;
var zielverzeichnis : string;
    dateiliste     : TStringlist;
    i              : Integer;
begin
  pb.position := 0;
  pb2.Position := 0;
  pb2.Visible := true;
  LStatus2.Visible := true;
  if FTP.Connected then
    ftp.Disconnect
  else begin
    FTP.Username := 'dein Accountname';
    FTP.Password := 'dein Passwort';
    FTP.Host    := 'URL';

    FTP.TransferType := ftBinary; //ftASCII;
    FTP.Connect;
    FTP.ChangeDir('updates');
    FTP.ChangeDir(version);
    FTP.ChangeDir(pfad);

    zielverzeichnis := (extractfiledir(paramstr(0))+pfadinstall+'\'+version+'\'+pfad);
    if not DirectoryExists(zielverzeichnis) then ForceDirectories(zielverzeichnis);
    dateiliste := Tstringlist.Create;
    FTP.List(dateiliste,'*.*',False);
    pb.Max := dateiliste.Count;
    dateiliste.SaveToFile(zielverzeichnis+'\'+version+'.txt');
    //Dateiliste herunterladen
    for i := 0 to dateiliste.Count - 1 do begin
      StatusSchreiben(dateiliste[i],4,f_status.M_Status); //ist eine Procedure die eine Infozeile in ein Memo schreibt
      LStatus1.Caption.Text := 'Download Datei '+inttostr(i+1)+' von '+inttostr(dateiliste.Count);
      LStatus2.Caption.Text := 'Aktueller Download: '+ dateiliste[i] +'('+inttostr(FTP.Size(dateiliste[i]))+' Bytes)';
      PB2.Max := FTP.Size(dateiliste[i]);
      FTP.Get(dateiliste[i],zielverzeichnis+'\'+dateiliste[i],True); //Dateiholen und überschreiben
      pb.Position := i+1;
      pb.Refresh;
    end;
    dateiliste.Free;
    FTP.Disconnect;
  end;
  pb2.Visible := false;
  LStatus2.Visible := false;
  DownloadFiles := true;
end;

procedure TFMain.FTPWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
  pb_3.Position := AWorkcount;
  pb_3.Refresh;
end;

procedure TF_INUpdate.FTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  pb_3.Position := 0;
  pb_3.Refresh;
end;

procedure TMain.bt_startenClick(Sender: TObject);
var DBVersionGefunden : boolean;
    zielverzeichnis  : string;
begin
  if DownloadFiles('3730','db',ftp,L_Status_2,L_Status_3,pb_2,pb_3) then begin
      //...
    end;
  end;
end;
Man kanns noch optimieren. Wer Ideen hat immer gerne.

Andidreas 6. Nov 2013 13:43

AW: IdFTP + progressbar wie ?!
 
Hallo,

der Beitrag ist zwar schon etwas älter, aber ich hätte hierzu mal noch eine Frage...

Der Source funktioniert bei mir nur wie folgt:

Delphi-Quellcode:
//******************************************************************************
// FTP Download with Progressbar                                              *
//******************************************************************************

procedure TForm1.Button20Click(Sender: TObject);

begin

  //Get File Size
  Try
    FTP.Host := 'Server';
    FTP.Username := 'User';
    FTP.Password := 'Password';
    FTP.Connect;
    FTP.ChangeDir('/Folder1/Folder2/');
    giFileSize := FTP.Size('setup.exe');
    FTP.Disconnect;
  Except
    FTP.Free;
    Exit;
  End;

  //Download File
  Try
    FTPDownload.Host := 'Server';
    FTPDownload.Username := 'User';
    FTPDownload.Password := 'Password';
    FTPDownload.Connect;
    FTPDownload.ChangeDir('/Folder1/Folder2/');
    FTPDownload.Get('setup.exe', 'C:\Temp\setup.exe', True);
    FTPDownload.Disconnect;
  Except
    FTPDownload.Free;
    Exit;
  End;

end;

procedure TForm1.FTPDownloadWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
  with FTPProgress do
  begin
    Max := giFileSize;
    Position := 0;
    Visible := true;
  end;
end;

procedure TForm1.FTPDownloadWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
  with FTPProgress do
    Position := Integer(AWorkCount);
end;

procedure TForm1.FTPDownloadWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  with FTPProgress do
    Visible := false;
end;
Wie man sieht verwende ich im Moment zwei FTP Komponenten.
Dies liegt daran da ich die File Größe erst ermittle und dann über die zweite den Download Starte.
Ich habe erst versucht beides über eine FTP Komponente zu machen, aber da hat er mir dann beim File Size ermitteln die OnWork / OnBeforeWork Aktionen ausgeführt.

Meine Frage daher, kann man es steuern wann er die OnWork / OnBeforeWork Ereignisse aufruft oder nicht?

himitsu 6. Nov 2013 14:15

AW: IdFTP + progressbar wie ?!
 
Du könntest natürlich die Events beim GetSize abhängen (z.B.
Delphi-Quellcode:
FTP.DownloadWorkBegin:=nil;
) und beim get wieder anhängen (z.B.
Delphi-Quellcode:
FTP.DownloadWorkBegin:=FTPDownloadWorkBegin;
)
oder über eine Variable die ausgabe steuern (beim GetSize einen Boolean auf True setzen und in den Events
Delphi-Quellcode:
if x then Exit;
).

AWorkCountMax hat dir nicht gefallen?
Delphi-Quellcode:
//******************************************************************************
// FTP Download with Progressbar *
//******************************************************************************

procedure TForm1.Button20Click(Sender: TObject);
begin
  Try
    FTPDownload.Host := 'Server';
    FTPDownload.Username := 'User';
    FTPDownload.Password := 'Password';
    FTPDownload.Connect;
    FTPDownload.ChangeDir('/Folder1/Folder2/');
    FTPDownload.Get('setup.exe', 'C:\Temp\setup.exe', True);
    FTPDownload.Disconnect;
  Except
    FTPDownload.Free; // wieso Free? (sei froh, daß dir TComponent die Form-Variable FTPDownload "zufällig" auf nil setzt, wenn sie published ist)
    Exit;
  End;

end;

procedure TForm1.FTPDownloadWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
  with FTPProgress do
  begin
    Max := AWorkCountMax;
    Position := 0;
    Visible := true;
  end;
end;

procedure TForm1.FTPDownloadWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
  with FTPProgress do
    Position := AWorkCount;
end;

procedure TForm1.FTPDownloadWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  with FTPProgress do
    Visible := false;
end;


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