Autor Beitrag
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Mo 02.02.04 00:47 
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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
...

var
  Form1: TForm1;
  ProgressBar1: TProgressBar;

implementation

{$R *.DFM}


oder hier:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
...

  private
    { Private-Deklarationen }
    ProgressBar1: TProgressBar;
  public
    { Public-Deklarationen }
  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.

ausblenden Delphi-Quelltext
1:
2:
var
  ProgressBar1: TProgressBar; // eine Progressbar definieren

...
ausblenden 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:
//ProgressBar erstellen und in eine StatusBar einfügen
function ProInStaBarCreate(StatusBar: TStatusBar; var ProgressBar: TProgressBar;
  PanelItem: Word): Boolean;
var
  k, PbLeft: Integer;
begin
  Result := False;

  if PanelItem > (StatusBar.Panels.Count - 1then 
    Exit;

  PbLeft := StatusBar.Left;
  for k := 0 to PanelItem - 1 do
    PbLeft := PbLeft + StatusBar.Panels.Items[k].Width;

  ProgressBar := TProgressBar.Create(StatusBar); //Wird mit Parent-Obj gelöscht
  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{Popov}


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

ausblenden Delphi-Quelltext
1:
2:
var
  ProgressBar1: TProgressBar; // eine Progressbar definieren


ausblenden volle Höhe 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:
// Funktion aufrufen
procedure TForm1.Button1Click(Sender: TObject);
begin
  if not ProInStaBarCreate(StatusBar1, ProgressBar1, 2then //2 für das dritte Panel
    MessageDlg('Fehler! ProgressBar wurde nicht eingefügt.', mtError, [mbOk], 0);
end;

// Einstellungen vornehmen (Min, Max, Position) und Timer starten
procedure TForm1.Button2Click(Sender: TObject);
begin
  with ProgressBar1 do 
  begin
    Min := 0;
    Max := 100;
    Position := Min;
    Timer1.Interval := 100;
    Timer1.Enabled := True;
  end;
end;

// Timer zählt die ProgressBar hoch
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  with ProgressBar1 do 
  begin
    Position := Position + 1;
    if Position > Max then 
      Timer1.Enabled := False;
  end;
end;

// Progressbar aus StatusBar entfernen. Danach nicht mehr zugreifen.
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 user profile iconLuckie 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.

ausblenden 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;  // SB_GETRECT ;

//Bestehende ProgressBar und in eine StatusBar einfügen
function ProInStaBarCreateL(StatusBar: TStatusBar; ProgressBar: TProgressBar;
  PanelItem: Word): Boolean;
var
  R : TRect;
begin
  Result := False;

  with ProgressBar do 
    if PanelItem > (StatusBar.Panels.Count - 1then 
      Visible := False
    else 
      Visible := True;

  Statusbar.Perform(SB_GETRECT, PanelItem, Integer(@R));
  ProgressBar.Parent := StatusBar;
  ProgressBar.BoundsRect := R;

  Result := True;
end;

//Muss in OnShow stehen, da in OnCraete die 
//Komponenten noch nicht gezeichnet sind.
procedure TForm1.FormShow(Sender: TObject);
begin
  ProInStaBarCreateL(StatusBar1, ProgressBar1, 0);
end;


Beispiel:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with ProgressBar1 do Position := Max div 2;
end;

Moderiert von user profile iconjasocul: Source an Style-Guide angepasst
Moderiert von user profile iconjasocul: Beitrag geprüft am 16.05.2006

_________________
Popov


Zuletzt bearbeitet von Popov am Di 03.02.04 03:06, insgesamt 1-mal bearbeitet