Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - ProgressBar - Akualisieren


Rylon - So 15.07.07 22:26
Titel: ProgressBar - Akualisieren
Hallo DF Community,

ich stehe mal wieder vor einem Problem:

Ich habe eine Progressbar, die ich gerne aktualisieren möchte, wärend eine Datei gedownloaded wird.
Das ist soweit kein Problem und funktioniert einwandfrei.

Um die Datei zu downloaden habe ich folgende Funktion:

Delphi-Quelltext
1:
2:
3:
4:
function DownloadFile (Source, Target: String; pgb : TProgressbar):boolean
begin
  ...
end;


Nun möchte ich diese Funktion gern ein wenig universeller gestalten, dass ich sie auch ohne Progressbar zu benutzen ist.

Hier mein Ansatz:

Delphi-Quelltext
1:
function DownloadFile (Source, Target: Stringvar Progress,ProgressMax: integer): boolean;                    


Wie bekomme ich es jetzt hin, dass meine ProgressBar die kontinuierlich gepollten Werte auch anzeigt.

Wäre euch sehr dankbar über ein Antwort.

Grüße Rylon


Dunkel - So 15.07.07 22:33

Hallo!

Quick&Dirty würde ich es mit einem optionalen Parametr machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function DownloadFile (Source, Target: String; pgb : TProgressbar = nil):boolean
begin
  if pgb <> nil then
    begin
      { TProgressBar wurde übergeben und kann aktualisiert werden }
    end;
  ...
end;


So kannst Du der Function optional als Parameter den Handle einer TProgressBar übergeben, oder Du lässt es bleiben.


Rylon - Mo 16.07.07 22:50
Titel: Ja, quick an' dirty
Ja, quick an' dirty,

das triffts sehr gut,

also ersteinmal danke für die Antwort, aber eine Lösung auf mein Problem ist es nicht,
denn ich möchte ja wissen, wie ich die variablen, die ich ständig aus der funktion herausbekomme auch verwenden kann,
denn mit deiner Lösung hab ich das selber Problem wieder, wenn ich z.b. ein memo stat eine Progressbar zum Anzeigen der Daten
haben möchte (Egal wie sinnvoll das jetzt ist :-), müsste ich den Funktionsheader wieder ändern.

Ich stelle mir das ungefär so vor:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function DownloadFile (Source, Target: Stringvar Progress,ProgressMax: integer): boolean;
begin

  ...
  LoeseEventAus();
  ...

end;



Delphi-Quelltext
1:
2:
3:
4:
procedure OnLoeseEventAus();
begin
...
end;



Delphi-Quelltext
1:
OnLoeseEventAus := externeEventProcedure ;                    



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure OnexterneEventProcedure();
begin

  progressbar1.max:=ProgressMax;
  progressbar1.position:=Progress;

end;


Ist jetzt ein wenig viel, aber so stelle ich mir das ujngefähr vor, weiß allerdings nicht obs überhaupt geht. Habe schon ein wenig rumprobiert und hätte gerne von euch eine Rückmeldung, ob das so zu realisieren ist und ob ihr Tipps hab wie man das mit dem Event machen kann.

MfG Rylon t.H.D.


Dunkel - Mo 16.07.07 23:34

OK, flexibel ist meine Quick&Dirty-Methode nicht, da hast Du recht.

Aber Du bist doch schon mal auf dem richtigen Weg. Mach es mit Events!

Kleines Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type  { das eigene Event }
  TProgressEvent = procedure(Sender: TObject; Progress: integer) of object;


type  { Deine Download-Klasse/Thread/sonstwas }
  TDownloadClass = class(TObject)
  private
    { Private-Deklarationen }
    fProgressEvent: TProgressEvent;
  public
    { Public-Deklarationen }
    function DownloadFile(): boolean;
    property OnProgressEvent: TProgressEvent read fProgressEvent write fProgressEvent;
  end;


type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    fDownloadClass: TDownloadClass;
    procedure fOnProgress(Sender: TObject; Progress: integer);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TDownloadClass.DownloadFile(): boolean;
var
  i: byte;
begin
  for i := 0 to 20 do
    begin
      if Assigned(fProgressEvent) then    { wenn das Event zugewiesen worden ist ... }
        fProgressEvent(Self, i);          { ... Event mit dem aktuellen Progress abfeuern }
      Sleep(100);
    end;
  Result:= True;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  fDownloadClass:= TDownloadClass.Create;        { Object erstellen }
  fDownloadClass.OnProgressEvent:= fOnProgress;  { Ereignis zuweisen }
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  fDownloadClass.Free;                           { Object freigeben }
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  fDownloadClass.DownloadFile;                   { Download starten }
end;

{ die Ereignisbehandlung : }
procedure TForm1.fOnProgress(Sender: TObject; Progress: integer);
begin
  { und hier kannst Du jetzt mit Progress machen was Du möchtest }
  Caption:= IntToStr(Progress);
end;

end.


Ich hoffe das hilft Dir weiter.


Rylon - Di 17.07.07 13:44
Titel: Danke
Danke Dunkel,

so werde ichs hinbekommen.

Aber nochmal eine generelle Frage (Nein ich habs noch nciht ausprobiert -> wenig Zeit im Moment):

Funktioniert das mit dem Event auch bei einer DLL oder eher nicht.

Ja und nochmals Danke^^

Grüße Rylon t.H.D.