Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi StatusBar anstatt Download-Fenster (https://www.delphipraxis.net/112647-statusbar-anstatt-download-fenster.html)

djpaull 24. Apr 2008 21:50


StatusBar anstatt Download-Fenster
 
Servus Leute!

Bin immernoch an meinem Browser dran. Es geht um Download kleiner Dateien, in meinem Fall sind es (viele) Bilder. Ich habe den Download etwas automatisiert, d.h. das Programm lädt mir die Bilder aus einer Liste (ListBox) ins Verzeichniss XY. Problem:

1. Während des Downloads ist das ganze Programm nicht ansprechbar und
2. Ich wollte es so machen, dass das Programm
a) mir den jeweiligen Download und den dazu gehörigem Fortschrittsbalken (wie in der ProgressBar) in der StatusBar anzeigt
b) den Gesammtfortschritt azeigt. Sollte gehen, da die Anzahl der zuladenden Dateien bekannt ist (ListBox1.Items.Count oder so).

Code zu 1.

Delphi-Quellcode:
procedure TForm1.DownloadClick(Sender: TObject);
var
  d: String; //Ordner Name
  url,ziehl: pchar;
begin
  d:=getcurrentwb.LocationName;
  createdir('c:/'+d);
  for i := 0 to Listbox2.items.Count - 1 do
    begin
    url:=pchar(listbox2.Items.Strings[i]);
    ziehl:=pchar('c:/'+d+'/'+inttostr(i+1)+'.jpg');
    URLDownloadToFile(nil, url, ziehl, 0 , nil);
  end;
end;
Hat jemand ne Idee oder Erfahrung?

EDIT1

Habe das hier gefunden. Weiss aber nicht, wie mich das weiter bringen soll, bzw. wie ich das Ganze aufrufen soll. Ausserdem gibt es bei mir keine Komponente "TGauge" (TurboDelphi (Explorer-Version)). Aber hier entstehen wieder 2 Probleme: wie verlege ich z.B.
Delphi-Quellcode:
 Form1.Gauge1.Progress := MulDiv(ulProgress,100,ulProgressMax);
auf die StatusBar und wie funtioniert der Aufruf?

Diamondback2007 25. Apr 2008 00:10

Re: StatusBar anstatt Download-Fenster
 
Also ich denk mal zum thema "Anwedung reagiert nicht" solltest du dir mal
Delphi-Quellcode:
Application.ProcessMessages
ansehen.

zum 2. punkt:
du willst wirklich für jeden download eine Progressbar in der statusleiste haben? das passt da doch dann gar nicht alles rein oder?
eine für alles ist ja okay aber mehr? ich weiß nicht...
für alle würde ich einfach die gesamtanzahl bytes ermitteln und dann gucken wie viel du schon geladen hast. Wenn du es so machst, dass du guckst wie viele bilder schon geladenen wurden, wird die anzeige nämlich ein bisschen springen...

gruß

djpaull 25. Apr 2008 00:53

Re: StatusBar anstatt Download-Fenster
 
Hey das mit
Delphi-Quellcode:
Application.ProcessMessages;
funzt - einfach vor dem "Donwload" einsetzen.
Delphi-Quellcode:
procedure TForm1.DownloadClick(Sender: TObject);
var
  d: String;
  url,ziehl: pchar;
  begin
  d:=getcurrentwb.LocationName;
  createdir('c:/'+d);
  for i := 0 to Listbox2.items.Count - 1 do
    begin
    Application.ProcessMessages; // Hier Einsetzen - Dann schmiert das Prog nicht ab :-)
    url:=pchar(listbox2.Items.Strings[i]);
    ziehl:=pchar('c:/'+d+'/'+inttostr(i+1)+'.jpg');
    URLDownloadToFile(nil, url, ziehl, 0 , nil);
  end;

end;
Zitat:

zum 2. punkt:
du willst wirklich für jeden download eine Progressbar in der statusleiste haben? das passt da doch dann gar nicht alles rein oder?
eine für alles ist ja okay aber mehr? ich weiß nicht...
Nicht für Jeden eine, sondern eine ProgressBar, die aber nach dem eine Datei fertig ist, den Fortschritt der nächsten anzeigt. Und eine ProgressBar für dem gesammten Download.
Zitat:

für alle würde ich einfach die gesamtanzahl bytes ermitteln und dann gucken wie viel du schon geladen hast.
Ja gut... schon... nur ich weiss nicht wie? :?:

djpaull 25. Apr 2008 01:25

Re: StatusBar anstatt Download-Fenster
 
Ich habs.
Zuerst den Code hier wiefolgt angepasst:

Delphi-Quellcode:
...
    BINDSTATUS_FINDINGRESOURCE:
    begin
      form1.StatusBar2.Panels[1].Text := 'Datei wurde gefunden...';
      if (usercancel) then
      begin
        Result := E_ABORT;
        exit;
      end;
    end;
    BINDSTATUS_CONNECTING:
    begin
      form1.StatusBar2.Panels[1].Text := 'Es wird verbunden...';
      if (usercancel) then
      begin
        Result := E_ABORT;
        exit;
      end;
    end;
    BINDSTATUS_BEGINDOWNLOADDATA:
    begin
      Form1.progressbar1.Position := 0;
      form1.StatusBar2.Panels[1].Text := 'Der Download wurde gestartet...';
      if (UserCancel) then
      begin
        Result := E_ABORT;
        exit;
      end;
    end;
    BINDSTATUS_DOWNLOADINGDATA:
    begin
      Form1.progressbar1.Position := MulDiv(ulProgress,100,ulProgressMax);
      form1.StatusBar2.Panels[1].Text := 'Datei wird heruntergeladen...';
      if (UserCancel) then
      begin
        Result := E_ABORT; exit;
      end;
    end;
    BINDSTATUS_ENDDOWNLOADDATA:
    begin
      form1.StatusBar2.Panels[1].Text := 'Download wurd beendet...';
    end;
...
Somit brauche ich auch keine Gauge mehr. :thumb:
Hier ist mein Aufruf:

Delphi-Quellcode:
procedure TForm1.DownloadClick(Sender: TObject);
begin
  dl;
end;

procedure tform1.DL;
var
  d: String;
  url,ziehl: pchar;
  cDownStatus : cDownloadStatusCallback;
  begin
  cDownStatus := cDownloadStatusCallBack.Create;
  d:=getcurrentwb.LocationName;
  createdir('c:/'+d);
  for i := 0 to Listbox2.items.Count - 1 do
    begin
    Application.ProcessMessages;
    url:=pchar(listbox2.Items.Strings[i]);
    ziehl:=pchar('c:/'+d+'/'+inttostr(i+1)+'.jpg');
    URLDownloadToFile(nil, url, ziehl, 0 , CDownStatus);
  end;
end;
Jetzt nur noch den Gesammtbalken.
Zitat:

einfach die gesamtanzahl bytes ermitteln und dann gucken wie viel du schon geladen hast
. Hmm... Wie war das noch mal :gruebel:

toms 25. Apr 2008 05:13

Re: StatusBar anstatt Download-Fenster
 
Hallo,

Da du viele kleine Bilder herunterladen möchtest, könnte man den Fortschritt
anhand der Total / heruntergeladenen Bilder berechnen.

d.h z.B bei Total 50 Bildern die Progressbar.Max auf 50 setzen und bei jedem heruntergeladenen Bild die Position der Progressbar um eins erhöhen.

Die andere Methode wäre, wie schon geschrieben:
Zitat:

einfach die gesamtanzahl bytes ermitteln und dann gucken wie viel du schon geladen hast

djpaull 25. Apr 2008 06:22

Re: StatusBar anstatt Download-Fenster
 
Danke!
Zitat:

d.h z.B bei Total 50 Bildern die Progressbar.Max auf 50 setzen und bei jedem heruntergeladenen Bild die Position der Progressbar um eins erhöhen.
Hab so gemacht. :thumb:


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