![]() |
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? |
Re: IdFTP + progressbar wie ?!
Ich weiß ja nu nicht obs wirklich weiterhilft, aber guck mal
![]() Da geht es um idHTTP Downloads mit fortschrittsanzeige, aber ich denke mal das lässt sich umschreiben. |
Re: IdFTP + progressbar wie ?!
Zitat:
Gibt es denn keinen hier, der sowas schon selber programmiert hat? |
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:
Wenn die Größe nicht übermittelt wird (AWorkCountMax = 0) dann musst du dir die Größe aus dem directory listing besorgen.
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; Grüße vom marabu |
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:
|
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 |
Re: IdFTP + progressbar wie ?!
Zitat:
Wie kann ich dieses problem umgehen oder lösen? HILFE!!! |
Re: IdFTP + progressbar wie ?!
Hallo,
ist denn hier keiner der mir weiterhelfen kann? :( :gruebel: :wall: :duck: |
Re: IdFTP + progressbar wie ?!
die sind hier ein wenig antwortfaul :wall:
sorry, ich kann dir nicht weiterhelfen |
Re: IdFTP + progressbar wie ?!
Zitat:
Zitat:
|
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: |
Re: IdFTP + progressbar wie ?!
Schon mal die Demos zu den Indy Komponenten angeguckt? Da sollte ein kompletter FTP Client dabei sein.
|
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....
|
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.
|
Re: IdFTP + progressbar wie ?!
Guten Morgen.
Bei einer vorkonfigurierten FTP Client-Komponente (host, username, password) hilft manchmal auch schon das hier weiter:
Delphi-Quellcode:
Grüße vom marabu
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; |
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:
Man kanns noch optimieren. Wer Ideen hat immer gerne.
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; |
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:
Wie man sieht verwende ich im Moment zwei FTP Komponenten.
//******************************************************************************
// 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; 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? |
AW: IdFTP + progressbar wie ?!
Du könntest natürlich die Events beim GetSize abhängen (z.B.
Delphi-Quellcode:
) und beim get wieder anhängen (z.B.
FTP.DownloadWorkBegin:=nil;
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