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: String; var 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 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: String; var 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 TProgressEvent = procedure(Sender: TObject; Progress: integer) of object;
type TDownloadClass = class(TObject) private fProgressEvent: TProgressEvent; public 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 fDownloadClass: TDownloadClass; procedure fOnProgress(Sender: TObject; Progress: integer); public 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 fProgressEvent(Self, i); Sleep(100); end; Result:= True; end;
procedure TForm1.FormCreate(Sender: TObject); begin fDownloadClass:= TDownloadClass.Create; fDownloadClass.OnProgressEvent:= fOnProgress; end;
procedure TForm1.FormDestroy(Sender: TObject); begin fDownloadClass.Free; end;
procedure TForm1.Button1Click(Sender: TObject); begin fDownloadClass.DownloadFile; end;
procedure TForm1.fOnProgress(Sender: TObject; Progress: integer); begin 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!