Eine TProgressBar in eine TStatusBar einfügen.
Hier ein Tipp wie man eine ProgressBar in eine StatusBar einfügen kann. Dazu wird eine zur Laufzeit erstellte ProgressBar benötigt.
Als erstes muß eine globale TProgressBar Variable definiert werden. Das kann man z.B. hier machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| ...
var Form1: TForm1; ProgressBar1: TProgressBar;
implementation
{$R *.DFM} |
oder hier:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| ...
private ProgressBar1: TProgressBar; public end; |
Als nächstes eine Funktion, die die ProgressBar erstellt und in die StatusBar einfügt. Die Funktion macht alles, d.h. von Create bis einfügen. Man muß vorher nichts machen, bis auf die Variablendefinition, aber man kann auch vorher nicht auf die Progressbar zugreifen. Nach Aufruf der Funktion kann man mit der ProgressBar wie gewohnt arbeiten.
Die Funktion benötigt drei Parameter:
- StatusBar in die die ProgressBar eingefügt werden soll
- den Namen der ProgressBar-Variable
- die Panelnummer der StatusBar in die die ProgressBar eingefügt werden soll.
Als Antwort erhällt man ein True wenn alles geklappt hat oder ein False wenn es Probleme gab. In diesem Fall sollten man prüfen ob die ProgressBar erstellt wurde. Wird eine zu hohe Panelnummer eingegeben, d.h. eine höhere als es Panels gibt, dann wird die Funktion abgebrochen.
Delphi-Quelltext
1: 2:
| var ProgressBar1: TProgressBar; |
...
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:
| function ProInStaBarCreate(StatusBar: TStatusBar; var ProgressBar: TProgressBar; PanelItem: Word): Boolean; var k, PbLeft: Integer; begin Result := False;
if PanelItem > (StatusBar.Panels.Count - 1) then Exit;
PbLeft := StatusBar.Left; for k := 0 to PanelItem - 1 do PbLeft := PbLeft + StatusBar.Panels.Items[k].Width;
ProgressBar := TProgressBar.Create(StatusBar); with ProgressBar do begin Parent := StatusBar; Top := 2; Left := PbLeft + 2; Width := StatusBar.Panels.Items[PanelItem].Width - 2; Height := StatusBar.Height - 2; end;
Result := True; end; |
Um die Freigabe der Variable muß sich jeder selbst kümmern. Ein:
ProgressBar1.Free;
reicht und die Progressbar verschwindet aus der StatusBar. Danach sollte man auf die Progressbar nicht mehr zugreifen, sonnst Fehlermeldung. Allerdings muß man nicht gleich mit Free dranngehen. Ein:
with ProgressBar do Position := Min;
reicht um den Balken verschwinden zu lassen. Danach kann wieder jede Zeit auf dia PanelBar zugegriffen werden. Man kann die Freigabe auch ganz sein lassen. Spätestens wenn das Programm beendet wird, wird auch das Objekt wieder freigegeben (wegen Parent-Zuweisung).
Beispiel:
Hier ein Beispiel wie eine Progressbar eingefügt wird. Benötigt werden für das Beispiel:
- eine StatusBar mit drei Panels
- eine Timer Komponente (Enabled := False;)
- drei Buttons
Delphi-Quelltext
1: 2:
| var ProgressBar1: TProgressBar; |
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:
| procedure TForm1.Button1Click(Sender: TObject); begin if not ProInStaBarCreate(StatusBar1, ProgressBar1, 2) then MessageDlg('Fehler! ProgressBar wurde nicht eingefügt.', mtError, [mbOk], 0); end;
procedure TForm1.Button2Click(Sender: TObject); begin with ProgressBar1 do begin Min := 0; Max := 100; Position := Min; Timer1.Interval := 100; Timer1.Enabled := True; end; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin with ProgressBar1 do begin Position := Position + 1; if Position > Max then Timer1.Enabled := False; end; end;
procedure TForm1.Button3Click(Sender: TObject); begin with ProgressBar1 do begin Free; end; end; |
-=ENDE=- Variante 1
Variante 2: -
Eine Variante, bei der die Progressbar zur Entwurfzeit bereits auf dem Formular abgelegt sein muß!
Variante 2 wurde nach einem Beispiel von Luckie entwickelt und erweitert.
Bei dieser Version muß die Progressbar bereits auf dem Formular liegen. Sie wird nur verschoben. Hier braucht man also keine Variable und es muß auch nichts freigegeben werden. Wird eine höhere Panelnummer angegeben wie es Panels gibt, dann wird die ProgressBar unsichtbar geschaltet. Ansonsten gelten die gleichen Parameter wie oben.
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:
| uses CommCtrl; function ProInStaBarCreateL(StatusBar: TStatusBar; ProgressBar: TProgressBar; PanelItem: Word): Boolean; var R : TRect; begin Result := False;
with ProgressBar do if PanelItem > (StatusBar.Panels.Count - 1) then Visible := False else Visible := True;
Statusbar.Perform(SB_GETRECT, PanelItem, Integer(@R)); ProgressBar.Parent := StatusBar; ProgressBar.BoundsRect := R;
Result := True; end;
procedure TForm1.FormShow(Sender: TObject); begin ProInStaBarCreateL(StatusBar1, ProgressBar1, 0); end; |
Beispiel:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin with ProgressBar1 do Position := Max div 2; end; |
Moderiert von jasocul: Source an Style-Guide angepasst
Moderiert von jasocul: Beitrag geprüft am 16.05.2006