Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy FTP mit Progressbar (https://www.delphipraxis.net/194190-indy-ftp-mit-progressbar.html)

Walter Landwehr 26. Okt 2017 15:06

Indy FTP mit Progressbar
 
Hallo,

ich bin schier am verzweifeln.

Ich lade mir eine Datei mit dem Indy FTP (TIdFTP) herunter und möchte dies in einer Progressbar anzeigen. Im Debug Modus zeigt mir das auch an, aber im Release Modus zeigt mir die Progressbar nichts an.
Hier mal mein Code:
Delphi-Quellcode:
   ProgressBar.Visible := True;
   ProgressBar.Max := UpdaterFtp.Size('Natuprax.zip');
   ProgressBar.Position := 0;
   ProgressBar.Steps := 1;
   ProgressBar.Min := 0;
   PageControl.ActivePage := DownloadTab;
   NeuStartenBtn.Enabled := False;
   AbbrechenBtn.Enabled := False;
   Refresh;
   if not UpdaterFtp.Connected then
    UpdaterFtp.Connect;
   UpdaterFtp.Get('Natuprax.zip', extractFilePath(Application.ExeName) + 'NatupraxNeu.zip', true, false);

procedure TUpdaterFrm.UpdaterFtpWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
  ProgressBar.Position := AWorkCount;
  Application.ProcessMessages;
end;

procedure TUpdaterFrm.UpdaterFtpWorkBegin(ASender: TObject;
  AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
  progressbar.max := AWorkCountMax;
end;

procedure TUpdaterFrm.UpdaterFtpWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  progressbar.Position := 0;
end;
Es gibt hier viele Einträge aus dem letzten Jahrzehnt aber leider keine Lösung.

Ich benutze Delphi 10.1 Berlin

Hat jemand eine Idee woran das liegt.

EWeiss 26. Okt 2017 15:16

AW: Indy FTP mit Progressbar
 
Zitat:

ProgressBar.Position := AWorkCount;
Application.ProcessMessages;
Sorry.. Das ist sehr schlecht und bremst die Progressbar nur aus.
versuche es mal so.

Delphi-Quellcode:
Progress := AWorkCount;

if (ProgressBar.Position <> Progress) then
  ProgressBar.Position := Progress;
Die Progressbar wird nur dann aktualisiert wenn nötig.
das schont die Ressourcen und beschleunigt das zeichnen der Progressbar selbst.

gruss

Walter Landwehr 26. Okt 2017 15:34

AW: Indy FTP mit Progressbar
 
Hallo, nein daran liegt es nicht. Ich habe mal den Code geändert und festgestellt das, das UpdaterFtpWork gar nicht richtig ausgeführt wird.
Der Wert in Progress bleibt immer gleich.
Delphi-Quellcode:
procedure TUpdaterFrm.UpdaterFtpWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
var Progress : Integer;
begin
  Progress := AWorkCount;
  if ProgressBar.Position <> Progress then
  begin
    ProgressBar.Position := Progress;
    showMessage(IntToStr(Progress));
  end;
  Application.ProcessMessages;
end;

Glados 26. Okt 2017 15:35

AW: Indy FTP mit Progressbar
 
Bevor man das hier weiter ausführt eine Frage:
ist das Programm nur für dich oder auch für andere bestimmt?

Walter Landwehr 26. Okt 2017 15:37

AW: Indy FTP mit Progressbar
 
Es ist mein Programm. Warum willst Du das wissen.

Glados 26. Okt 2017 15:38

AW: Indy FTP mit Progressbar
 
Weil wenn man das für andere freigibt würde ich niemals FTP nehmen.

Auch so empfehle ich dir per HTTP herunterzuladen und dich von FTP zu verabschieden.
Hier ist alles erklärt: https://stackoverflow.com/questions/...59305#28459305

EWeiss 26. Okt 2017 15:41

AW: Indy FTP mit Progressbar
 
Zitat:

Der Wert in Progress bleibt immer gleich.
Ok! Aber destotrotz ein Application.ProcessMessages; ist der Tod für deine Progressbar ;)
Diese sollte man nicht unterbrechen und nur aktualisieren wenn nötig.

Zitat:

und dich von FTP zu verabschieden.
Warum sollte er das tun wenn er einen FTP Server hat?
Das war aber auch nicht die frage.

gruss

Glados 26. Okt 2017 15:57

AW: Indy FTP mit Progressbar
 
Zitat:

Warum sollte er das tun
Weil es einfach unsicher ist irgendwelche Logindaten in eine Datei mit einzukompilieren.
Alles was man per FTP runterladen kann, kann man auch über HTTP runterladen.

Eine korrekt funktionierende Lösung habe ich oben bereits erwähnt.

Zitat:

Ok! Aber destotrotz ein Application.ProcessMessages; ist der Tod für deine Progressbar
Diese sollte man nicht unterbrechen und nur aktualisieren wenn nötig.
Das verstehe ich irgendwie nicht. Warum sollte das der Tod sein? Wir wissen ja nicht einmal, ob er einen Thread benutzt oder nicht.
Als Tod würde ich es nicht betrachten. Denn das ist es keinesfalls.

Daniel 26. Okt 2017 16:17

AW: Indy FTP mit Progressbar
 
Zitat:

Zitat von Glados (Beitrag 1384272)
Zitat:

Warum sollte er das tun
Weil es einfach unsicher ist irgendwelche Logindaten in eine Datei mit einzukompilieren.
Alles was man per FTP runterladen kann, kann man auch über HTTP runterladen.

Eine korrekt funktionierende Lösung habe ich oben bereits erwähnt.

Du hast eine Lösung verlinkt, aber die macht etwas anderes. Um die Frage der Logindaten hast Du Dich komplett gedrückt. Der von Dir verlinkte Code lädt eine Datei via HTTPS herunter, nicht mehr und nicht weniger. Es ist grundsätzlich richtig, den Transportweg zu sichern. Aber den von Dir vorgebrachten Einwand mit den einkompilierten Logindaten hast Du selbst auch nicht behandelt.

EWeiss 26. Okt 2017 16:23

AW: Indy FTP mit Progressbar
 
Zitat:

Zitat von Glados (Beitrag 1384272)
Zitat:

Warum sollte er das tun
Weil es einfach unsicher ist irgendwelche Logindaten in eine Datei mit einzukompilieren.
Alles was man per FTP runterladen kann, kann man auch über HTTP runterladen.

Eine korrekt funktionierende Lösung habe ich oben bereits erwähnt.

Zitat:

Ok! Aber destotrotz ein Application.ProcessMessages; ist der Tod für deine Progressbar
Diese sollte man nicht unterbrechen und nur aktualisieren wenn nötig.
Das verstehe ich irgendwie nicht. Warum sollte das der Tod sein? Wir wissen ja nicht einmal, ob er einen Thread benutzt oder nicht.
Als Tod würde ich es nicht betrachten. Denn das ist es keinesfalls.

Wenn du anstelle des zeichnen der Progressbar die Anwendung weiterhin ihr spielchen treiben lässt was glaubst wie genau
die anzeige der Progessbar dann noch ist? Bzw.. diese aktualisiert.

Hast du mal eine Progressbar unter Volllast einer Anwendung getestet?
Ich meine so was hier.
Glaubst du im ernst das die Progressbar jemals ihren Status ändert? Wenn du da noch mit ProcessMessages rum machst?

Denke nicht!
Wenn ich schon eine Progressbar in meine Anwendung integriere dann sollte ich diese nicht durch ProcessMessages blockieren.

Zitat:

Wir wissen ja nicht einmal, ob er einen Thread benutzt oder nicht.
Das hat nichts mit einem Thread zu tun.

gruss

bra 26. Okt 2017 17:19

AW: Indy FTP mit Progressbar
 
Application.ProcessMessages benötigt man teilweise gerade WEIL sich sonst die GUI nicht aktualisiert. :roll:

EWeiss 26. Okt 2017 17:39

AW: Indy FTP mit Progressbar
 
Zitat:

Zitat von bra (Beitrag 1384281)
Application.ProcessMessages benötigt man teilweise gerade WEIL sich sonst die GUI nicht aktualisiert. :roll:

Ja?
Dann hast du ein Design technisches Problem in deinem code.
Aber jeder wie er will. ;)

Meine Programme freezen nicht.

gruss

Glados 26. Okt 2017 18:37

AW: Indy FTP mit Progressbar
 
Zitat:

Glaubst du im ernst das die Progressbar jemals ihren Status ändert? Wenn du da noch mit ProcessMessages rum machst?
Denke ich sehr wohl!
Was denkst du wie ich es mache? Genau so. Hat immer funktioniert und wird vermutlich noch ewig so funktionieren.

Zitat:

Meine Programme freezen nicht.
Meine auch nicht. Und ich benutze ProcessMessages, Wahnsinn :shock:

@Daniel keine Ahnung was du mir sagen möchtest. ist ja aber auch egal. Ich halte mich jetzt raus aus diesem Thema hier. Man bekommt ja eh nur aufs Maul.

Walter Landwehr 4. Nov 2017 08:38

AW: Indy FTP mit Progressbar
 
Oh, Oh Schande auf mein Haupt. Ich hatte doch tatsächlich diese Zeile im Code:
Delphi-Quellcode:
UpdaterFtp.OnWork := Nil;
Kein Wunder das es nicht funktionierte. Dieser Fehler passiert mir nicht noch mal.

PiBi7 15. Okt 2019 13:48

AW: Indy FTP mit Progressbar
 
Hallo zusammen
Ja dieses Thema ist schon ziemlich alt, aber ich stehe nun auch vor diesem/einem ähnlichen Problem.

ein Klick auf den Button "btnDownload" auf einem FireMonkey Download-Form sollte auf einem Android-Tablet folgendes machen:
1. btnDownload.Enabled := False
2. ausblenden eines Textes
3. dafür einblenden eines Fortschrittbalken
4. die Datei per HTTP-Get herunterladen (TIdHTTP.Get())
5. während dem Download den Fortschrittsbalken nachführen

Sämtliche Änderungen am GUI (en-/disablen und Fortschritt) werden aber nur nachgeführt, wenn Application.ProcessMessages aufgerufen wird. In vielen Posts wird jedoch von der Verwendung von ProcessMessages bei Android wehement abgeraten. Hat jemand einen Vorschlag, wie hier richtig vorzugehen ist? Ich dachte mir, dass Indy das von sich aus mittels Thread löst und ich diesen Vorgang nicht auch noch in einen anderen Prozess Packen muss.

- Ist ProcessMessages doch richtig, oder wie kann man einen Refresh des GUI sonst noch auslösen (Refresh geht nicht)?
- Wird ProcessMessages in einer späteren Delphi-Version evtl. nicht mehr unterstützt?

Herzlichen Dank in die Runde
Patrik


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