Problem einbetten einer Progressbar in eine StatusBar

Rund um die LCL und andere Komponenten
Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Problem einbetten einer Progressbar in eine StatusBar

Beitrag von Linkat »

Hallo,
ich möchte eine Progressbar ín eine Statusbar einbetten.

Warum erscheint die Progressbar nicht.

Code: Alles auswählen

unit StatusProgu;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls,
  Buttons;

type

  { TForm1 }

  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Button1: TButton;
    StatusBar1: TStatusBar;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
      const Rect: TRect);
  private
    ProgBar                      :TProgressBar;
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  ProgBar:=TProgressBar.Create(Self);
  ProgBar.Anchors:=[];
  ProgBar.Min:=0;
  ProgBar.Max:=100;
  ProgBar.Position:=0;
  ProgBar.Height:=15;
  ProgBar.Width:=60;
  ProgBar.Parent:=StatusBar1;
  StatusBar1.Panels[0].Style:=psOwnerDraw;
  ProgBar.Visible:=True;
  ProgBar.Enabled:=True;
  StatusBar1.Invalidate;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i           :Integer;
begin
  for i:=0 to 100 do begin
    Caption:=i.ToString;
    Application.ProcessMessages;
    ProgBar.Position:=i;
    Sleep(10);
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  ProgBar.Free;
end;

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;
  Panel: TStatusPanel; const Rect: TRect);
begin
  if (Panel=StatusBar1.Panels[0]) then ProgBar.BoundsRect:=Rect;
end;

end.
hat jemand eine Idee?

Vielen Dank.

Gruß, Linkat
Dateianhänge
StatusProg.zip
(139.73 KiB) 139-mal heruntergeladen
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

wp_xyz
Beiträge: 5188
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem einbetten einer Progressbar in eine StatusBar

Beitrag von wp_xyz »

Bei mir (Win-11) hat sich die Progressbar gezeigt. Ich habe trotzdem deinen Code wie folgt vereinfacht:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  ProgBar:=TProgressBar.Create(Self);
  ProgBar.Min:=0;
  ProgBar.Max:=100;
  ProgBar.Position:=0;
  ProgBar.Parent:=StatusBar1;
  ProgBar.Visible:=False;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  ProgBar.SetBounds(0, 0, Statusbar1.Width-1, Statusbar1.Height-1);
  ProgBar.Show;
  for i:=0 to 100 do begin
    Caption:=i.ToString;
    Application.ProcessMessages;
    ProgBar.Position:=i;
    Sleep(10);
  end;
end; 
Grund-Idee:
- Parent der Progressbar auf die Statusbar setzen
- Zunächst Progressbar verstecken (ProgBar.Visible := false, oder ProgBar.Hide)
- Wenn der zu überwachende Prozess startet, Progressbar anzeigen (ProgBar.Show) und in Größe der Größe der Statusbar anpassen
- Am Ende Progressbar ggfs wieder verstecken (aber Achtung bei Windows: hier wird wegen der Animation die Progressbar evtl schon ausgeblendet, bevor sie ganz gefüllt ist.)
- Ein Custom-Draw des Status-Panels ist nicht erforderlich.

Ach ja noch: Da du die ProgressBar mit Owner Self (also dem Formular) erzeugst, musst du keinen Code mehr schreiben, um sie wieder freizugeben. Darum kümmert sich der Owner automatisch.

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Problem einbetten einer Progressbar in eine StatusBar

Beitrag von Zvoni »

Müsste nicht das Panel der StatusBar der Parent/Owner sein?
Würde doch deutlich mehr Sinn ergeben
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Problem einbetten einer Progressbar in eine StatusBar

Beitrag von af0815 »

Zvoni hat geschrieben: Fr 8. Nov 2024, 07:57 Müsste nicht das Panel der StatusBar der Parent/Owner sein?
Würde doch deutlich mehr Sinn ergeben
Das hängt IMHO davon ab, ob die Statusbar im "simple Mode" oder mit Panels konfiguriert ist.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Problem einbetten einer Progressbar in eine StatusBar

Beitrag von Linkat »

Vielen Dank @wp_xyz und Zvoni für Hinweise und Tipps.

Aber es funktioniert leider nicht.

Vor über 10 Jahren (in der Firma) hatte ich eine Progressbar In eine Statusbar in einem Windows-Programm eingearbeitet. Aber genau diese Technik funktioniert nicht auf meinem Linux Mint.

Da dies eh nur ein optischer Effekt ist, werde ich also vorerst die Progressbar am unteren Rand anordnen und mein eigentliches Programm weiter entwickeln.

Gruß,
Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

wp_xyz
Beiträge: 5188
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem einbetten einer Progressbar in eine StatusBar

Beitrag von wp_xyz »

Linkat hat geschrieben: Fr 8. Nov 2024, 08:52 Aber genau diese Technik funktioniert nicht auf meinem Linux Mint.
Dass du auf Mint bist, hättest du gleich im ersten Beitrag sagen können, dann hätte man sich diesen Spezialfall gleich von Anfang an vornehmen können.

Aber egal: Ich habe nun mein Testprogramm auf Mint laufen lassen, und - ja - da erscheint die Progressbar nicht, zumindest nicht unter gtk2, unter qt5 funktioniert alles wie gewünscht. Auch der Versuch, unter gtk2 auf die Progressbar komplett zu verzichten und stattdessen einfach im StatusPanel ein größer werdendes Rechteck zu zeichnen, schlägt fehlt, weil das OnDrawPanel-Ereignis offenbar nicht aufgerufen wird. In diesem Fall würde ich die Progressbar im Parent Formular belassen und mit Align=alBottom an den unteren Rand des Formulars setzen. Dann wenn die zu verfolgenden Prozess läuft, würde ich die Progressbar auf sichtbar schalten und die Statusbar auf unsichtbar.

Code: Alles auswählen

procedure TForm1.Button4Click(Sender: TObject);
var
  i: Integer;
begin
  ProgBar.Parent := self;
  ProgBar.Align := alBottom;
  ProgBar.Show;
  Statusbar1.Hide;
  for i:=0 to 100 do begin
    Caption:=i.ToString;
    ProgBar.Position:=i;
    Application.ProcessMessages;
    Sleep(10);
  end;
  ProgBar.Hide;
end; 

wp_xyz
Beiträge: 5188
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem einbetten einer Progressbar in eine StatusBar

Beitrag von wp_xyz »

Zvoni hat geschrieben: Fr 8. Nov 2024, 07:57 Müsste nicht das Panel der StatusBar der Parent/Owner sein?
Würde doch deutlich mehr Sinn ergeben
TStatusPanel ist kein TWinControl, kann also nicht als Parent der Progressbar fungieren. Ob es der Owner sein soll, wäre abzuwägen. Denn wenn man das Panel löscht, würde dann auch die Progressbar gelöscht - fatal, wenn man die vielleicht auch noch für etwas anderes einsetzen will.

Benutzeravatar
theo
Beiträge: 10920
Registriert: Mo 11. Sep 2006, 19:01

Re: Problem einbetten einer Progressbar in eine StatusBar

Beitrag von theo »

wp_xyz hat geschrieben: Fr 8. Nov 2024, 10:43
Linkat hat geschrieben: Fr 8. Nov 2024, 08:52 Aber genau diese Technik funktioniert nicht auf meinem Linux Mint.
Dass du auf Mint bist, hättest du gleich im ersten Beitrag sagen können, dann hätte man sich diesen Spezialfall gleich von Anfang an vornehmen können.
Ich würde bevorzugen, wenn die Leute dazuschreiben würden, welches Widgetset sie verwenden (GTK2, GTK3, Qt4/5/6...).
Die Distribution finde ich in diesem Zusammenhang erst einmal nicht entscheidend.
Und ja, wenn man "komisches Zeug" macht, sollte man das Widgetset immer angeben, weil "komisches Zeug" auf manchen Umgebungen läuft und auf anderen vielleicht ungetestet oder unmöglich ist.
:wink:

Benutzeravatar
Ally
Beiträge: 283
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Problem einbetten einer Progressbar in eine StatusBar

Beitrag von Ally »

Hallo Linkat,

anbei noch ein ganz anderer Lösungsansatz.
Ein Panel mit dem Ankereditor am unteren Fensterrand verankern, darauf kann man dann was auch immer platzieren und mit dem Ankereditor ausrichten.

Gruß Roland
Dateianhänge
StatusPanel.zip
(22.72 KiB) 202-mal heruntergeladen

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Problem einbetten einer Progressbar in eine StatusBar

Beitrag von Zvoni »

Vielleicht hier?
https://forum.lazarus.freepascal.org/in ... 09.15.html
User hat laut Signatur auch Mint

Oder hier: https://forum.lazarus.freepascal.org/in ... ic=35831.0
Hauptproblem scheinen die Anchors zu sein
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Problem einbetten einer Progressbar in eine StatusBar

Beitrag von Linkat »

Linux Mint steht zwar in der Signatur aber nicht GTK2. Aber besser ist, wenn man genauere Angaben macht.

Vielen Dank an alle, die sich hier beteiligt haben. Ich werde wie oben angedeutet und von WP und Ally in ähnlicher Form gelöst, eine Lösung ohne StatusBar anwenden.

Ich schreibe in den Header nicht [gelöst], da ja eine andere Lösung genutzt wird. Aber vielleicht gibt es ja später einmal ein Lösungsweg.

Viele Grüße,
Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 596
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Problem einbetten einer Progressbar in eine StatusBar

Beitrag von Niesi »

.
Zuletzt geändert von Niesi am Fr 8. Nov 2024, 21:04, insgesamt 2-mal geändert.
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 596
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Problem einbetten einer Progressbar in eine StatusBar

Beitrag von Niesi »

Linkat hat geschrieben: Do 7. Nov 2024, 21:50 Hallo,
ich möchte eine Progressbar ín eine Statusbar einbetten.

Warum erscheint die Progressbar nicht.

...

hat jemand eine Idee?

Vielen Dank.

Gruß, Linkat
Schau mal bitte, vielleicht kannst Du damit leben - ist ein wenig aufwändiger, aber die Optik dürfte stimmen (Ich hab die StatusBar1 weiß eingefärbt, damit sie besser erkennbar ist) ...


StatusProgII.7z


Bildschirmfoto vom 2024-11-08 19-21-04.png

Bildschirmfoto vom 2024-11-08 19-21-10.png
[/quote]
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 596
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Problem einbetten einer Progressbar in eine StatusBar

Beitrag von Niesi »

.
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Problem einbetten einer Progressbar in eine StatusBar

Beitrag von Linkat »

@Niesi
Vielen Dank für dein Beispiel.
Aber in dem Programm ist die ProgressBar nicht in der Statusbar eingebettet. Es fehlt die Parent Zuweisung und die DrawPanel-Prozedur ist wirkungslos. Es ist letztendlich wie bei dem Vorschlag von wp_xyz ein ein- und ausschalten der Progressbar und Statusbar.
So ähnlich habe ich das jetzt auch in mein Programm eingebaut.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Antworten