Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Progressbar updated nicht (https://www.delphipraxis.net/19437-progressbar-updated-nicht.html)

HaCkAttaCk2001 3. Apr 2004 10:21


Progressbar updated nicht
 
Hi @ all.

Folgendes Problem: Ich habe nach der Anleitung hier http://www.delphipraxis.net/internal_redirect.php?t=75 ein Programm erstellt welches mir eine Datei herunterlädt. Das Herunterladen funktioniert einwandfrei, aber die ProgressBar rühert sich keinen Millimeter. Sie bleibt einfach auf 0 %, auch wenn der DL fertig ist.
Ein weiteres (kleineres) Problem ist, dass das Programm sich während des Downloads nicht schließen lässt (reagieren tut es aber noch).

Mir geht es vor allem um die Behebung des 1. Problems, denn ich hab keine Ahnung warum sich da nichts rühert.



C ya!

Sharky 3. Apr 2004 10:28

Re: Progressbar updated nicht
 
Hai HaCkAttaCk2001,

erst einmal: "Herzlich Willkommen in der Delphi-PRAXIS".

Ohne etwas Quellcode von Dir wird es schwer sein den Fehler zu finden. Wenn es nicht zu viel ist post ihn doch einmal.
Wenn er zu groß ist hänge ihn einfach als Datei an dein Posting.

HaCkAttaCk2001 3. Apr 2004 10:41

Re: Progressbar updated nicht
 
Hi.

Danke für die Begrüßung ;) .

Also der Code ist im Grunde genommen haargenau gleich wie im Beispiel, aber hier ist er nochmal ;) :
In Reihenfolge mal alles das was ich als wichtig erachte:

Code:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Psock, NMHttp, inifiles, ComCtrls, UrlMon, ActiveX,
  Gauges;
Code:
type
  cDownloadStatusCallback = class(TObject,IUnknown,IBindStatusCallback)
  private
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
    function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
    function GetPriority(out nPriority): HResult; stdcall;
    function OnLowResource(reserved: DWORD): HResult; stdcall;
    function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult; stdcall;
    function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
    function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
    function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc; stgmed: PStgMedium): HResult; stdcall;
    function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
  end;
Ist wie gesagt unverändert...

Code:
var
  Form1: TForm1;
  usercancel: Boolean = False;
Code:
function cDownloadStatusCallback.OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult;
begin
  case ulStatusCode of
    BINDSTATUS_FINDINGRESOURCE:
    begin
      Form1.Label1.Caption := 'Datei wurde gefunden...';
      if (usercancel) then
      begin
        Result := E_ABORT;
        exit;
      end;
    end;
    BINDSTATUS_CONNECTING:
    begin
      Form1.Label1.Caption := 'Es wird verbunden...';
      if (usercancel) then
      begin
        Result := E_ABORT;
        exit;
      end;
    end;
    BINDSTATUS_BEGINDOWNLOADDATA:
    begin
      Form1.Gauge1.Progress := 0;
      Form1.Label1.Caption := 'Der Download wurde gestartet...';
      if (UserCancel) then
      begin
        Result := E_ABORT;
        exit;
      end;
    end;
    BINDSTATUS_DOWNLOADINGDATA:
    begin
      Form1.Gauge1.Progress := MulDiv(ulProgress,100,ulProgressMax);
      Form1.Label1.Caption := 'Datei wird heruntergeladen...';
      if (UserCancel) then
      begin
        Result := E_ABORT; exit;
      end;
    end;
    BINDSTATUS_ENDDOWNLOADDATA:
    begin
      Form1.Label1.Caption := 'Download wurde beendet...';
    end;
  end;
  Application.ProcessMessages;

  Result := S_OK;
end;
...und das auch ;) . Aber wie's aussieht arbeitet das MulDiv nicht... Wenn ich mir das ganze mit IntToStr(MulDiv....) mal testweise in ein Label schreiben lasse, dann steht dort einfach nur 0 .

Code:
  if Label3.Caption < Label5.Caption then //das ist eine Art Versionsabgleich
  begin
    Memo2.Lines.Add('>>Es wurde eine neue Version gefunden!');
    cDownStatus := cDownloadStatusCallBack.Create;
    try
      URLDownloadToFile(nil,'http://www.unsereherren.de/zombienation.wav','C:\test.wav',0,CDownStatus);
    finally
      cDownStatus.Free;
    end;
  end;
So, wie man sieht hab ich wirklich so gut wie gar nix geändert, weshalb es mich eigentlich wundert das die Gauge nicht funktionieren will.


C ya!

himitsu 3. Apr 2004 11:01

Re: Progressbar updated nicht
 
Wen die Datei klein ist und ganz schnell runtergeladen wurde, oder in schon im IE-Cache war, also auch schnell da war, dann wird BINDSTATUS_DOWNLOADINGDATA unter umständen garnicht aufgerufen.

Erweiter mal BINDSTATUS_ENDDOWNLOADDATA:
Code:
    BINDSTATUS_ENDDOWNLOADDATA:
    begin
      Form1.Label1.Caption := 'Download wurde beendet...';
      [color=red]Form1.Gauge1.Progress := 100;[/color]
    end;
dadurch wird auf jeden Fall - bei einem erfolgreich abgeschlossenem Download das Gauge auf 100 gesetzt.

Wenn es dann immernoch nicht geht, dann hast du doch irgendwo 'nen Fehler drin.

HaCkAttaCk2001 3. Apr 2004 11:10

Re: Progressbar updated nicht
 
Hi.


Ich hatte mal zum Test eine ca. 200 MB große Datei laden lassen... die hatte ich auch vorher noch nie geladen... Irgendwann war sie dann tatsächlich fertig, aber die Statusbar hat sich nicht gerühert...

Edit: Fehler drin... hm. Ich hab das ja wirklich nur abkopiert und am Hauptteil überhaupt nichts geändert, da ich viel zu blöd für solche Geschichten bin ;) . Ich freu mich wenn es funktioniert... Und der Kompiler meldet weder Fehler noch Warnungen oder ähnliches.


C ya!

himitsu 3. Apr 2004 11:34

Re: Progressbar updated nicht
 
Schon mal geprüft, ob die Rückrufprozedur auch aufgerufen wird?

z.B. einen Haltepunkt reingesetzt, oder was anderes zum Test reingemacht?
Code:
function cDownloadStatusCallback.OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult;
begin
  [color=red]case ulStatusCode of [/color]
    BINDSTATUS_FINDINGRESOURCE:
    begin
      Form1.Label1.Caption := 'Datei wurde gefunden...';
Code:
function cDownloadStatusCallback.OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult;
begin
  [color=red]Form1.LabelTest.Caption := 'wurde aufgerufen'; [/color]
  case ulStatusCode of
    BINDSTATUS_FINDINGRESOURCE:
    begin

HaCkAttaCk2001 3. Apr 2004 14:13

Re: Progressbar updated nicht
 
Hi.

Nun ja, alles in dieser Prozedur funktioniert, "Datei wurde gefunden...", "Es wird verbunden..." wird alles durchgegangen und abgearbeitet. Ich hab jetzt auch mal dort ne Überprüfung reingesetzt, wie in deinem Beispiel: funktioniert.

Das Problem ist ja nur das die Gauge nicht updated. Nur warum tut sie das nicht?!


C ya!

EDIT: Ich hab das ganze jetzt wieder rausgenommen und mir die HTTPGet-Komponente geholt ;) . Funktioniert blendend :D

Meflin 3. Apr 2004 14:52

Re: Progressbar updated nicht
 
problem hatt ich auch mal. es gibt da von der progressbar aus ne procedure zum updaten. leider weis ich nimmer genau wie die heist. die könnte dein problem lösen!

Luckie 3. Apr 2004 15:10

Re: Progressbar updated nicht
 
Ruf mal nach dem Setzen der neuen Position die Methode Refresh oder Repaint auf.

Meflin 4. Apr 2004 11:08

Re: Progressbar updated nicht
 
Zitat:

Zitat von Luckie
Ruf mal nach dem Setzen der neuen Position die Methode Refresh oder Repaint auf.

das wars :!:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:39 Uhr.
Seite 1 von 2  1 2      

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