Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ProgressBar für Perfektionisten (https://www.delphipraxis.net/210695-progressbar-fuer-perfektionisten.html)

NicoleWagner 28. Mai 2022 19:30

ProgressBar für Perfektionisten
 
In eine Anwendung habe ich einen TProgressBar.
Ich benutze ich für einen Coundtown. D.h. ist starte ihn grün und es wird dann im Verlauf weiß.
///wer hier die Themen mitlas, kombiniert: mein TTimer funktioniert schon (danke der Gemeinschaft!)

Dieer ProgressBar hat eine Farbanimation: Die Farbe läuft von links nach rechts.
Manche sagen, das wäre doch ganz egal, ich finde es jedoch seltsam:
Die Animation läuft von links nach rechts und die Bewegung läuft von rechts nach links.

Lässt sich die Animation abschalten?

(Hinweis: auf Marque zu schalten klappte nicht, da blinkt er)

jaenicke 28. Mai 2022 20:22

AW: ProgressBar für Perfektionisten
 
Die Animation lässt sich so einfach nicht abschalten (selbst zeichnen oder Themes für das Control deaktivieren wären zwei der Möglichkeiten). Microsoft hat in den UI Guidelines klar festgelegt, dass man für solche Zwecke keine Fortschrittsanzeige nutzen soll.

Delphi hat auch eine TGauge. Die könntest du z.B. verwenden.

Ich hatte vor über 10 Jahren mal eigene Controls geschrieben, u.a. eine Multi-Progressbar, die man auch hier nutzen könnte:
https://entwickler-ecke.de/viewtopic...=720432#720432
Der Quelltext ist allerdings uralt, aber es gibt ja genug solcher Komponenten.

Oder du drehst das ganze einfach um und zeigst nicht die verbliebene Zeit, sondern die abgelaufene Zeit an, so dass du die Fortschrittsanzeige ganz normal nutzen könntest.

himitsu 29. Mai 2022 07:51

AW: ProgressBar für Perfektionisten
 
Jupp, Rückwärts (nach Links) geht es (aktuell) ohne Animation.

Man kann also z.B. um 1 mehr setzen und dann sofort auf den gewünschten Wert ... dann geht es einen Schritt zurück und wird somit sofort ohne Anumation dargestellt.

TurboMagic 29. Mai 2022 08:44

AW: ProgressBar für Perfektionisten
 
Evtl. gibt's hier auch was brauchbares zu dem Thema:
https://github.com/project-jedi/jvcl

Benötigt aber die Installation von:
https://github.com/project-jedi/jcl

BerndS 29. Mai 2022 14:53

AW: ProgressBar für Perfektionisten
 
Es ist sicher Geschmackssache, aber auch bei einem Countdown würde ich den Fortschrittsbalken von links nach rechts bewegen.

venice2 29. Mai 2022 18:45

AW: ProgressBar für Perfektionisten
 
Eine Progressbar sollte von links nach rechts laufen.
Meine Meinung.

himitsu 29. Mai 2022 20:08

AW: ProgressBar für Perfektionisten
 
Och, ein rückwärtszählender Countdown (runterzählende Zeit), darf auch mal andersrum sein
auch wenn man dort den "Fortschritt" auch mal als Rückschritt ansehn könnte.

PS: Delphi-Referenz durchsuchenTGauge gäbe es noch, aber das ist eigentlich mehr eine häßliche jahrzehnte alte Demokomponente, die niemals weiterentwickelt wurde.


Schade, dass es nicht so einfach ist, die "erweiterte" Fortschrittsgrafik des Explorers nutzen zu können.
Auch der TMediaPlayer bietet nur die uralten Dateioperations-Gafiken an.

jaenicke 30. Mai 2022 11:04

AW: ProgressBar für Perfektionisten
 
Zitat:

Zitat von himitsu (Beitrag 1506458)
Jupp, Rückwärts (nach Links) geht es (aktuell) ohne Animation.

Du meinst die Glättung der Bewegung der Fortschrittsanzeige, nicht die Animation, die immer wieder von links nach rechts über die Leiste läuft.

himitsu 30. Mai 2022 12:01

AW: ProgressBar für Perfektionisten
 
Joar, genau das, den "animierten" Bewegungspfad des Endes der Bar.

NicoleWagner 31. Mai 2022 08:06

AW: ProgressBar für Perfektionisten
 
Danke für alle Antworten.
Mein Delphi (XE3) zeigt mir leider kein "TGauge".

Wäre es Web, dann würde ich Folgendes tun: Ich würde eine Grafik von ein paar grünen Pixeln erzeugen und diese Grafik über die ganze Breite aufspannend also zerren. Geht das bei Delphi auch?
D.h. ich schreibe nicht: ProgressBar1.Position:=ProgressBar1.Position - 1;
sondern: Grafik1.Width:=Grafik1.Width - 1;

Spricht da von der Performance her etwas dagegen? Denn vermutlich muss ich da alle Sekunden (auf die mein Timer eingestellt ist) ein "Refresh" nachschieben.
Und wenn es Euch günstig erscheint, welche Komponente verwende ich dafür am Besten?

BerndS 31. Mai 2022 08:50

AW: ProgressBar für Perfektionisten
 
Ein TLabel mit den Eigenschaften
AutoSize = False
Color = clGreen
ParentColor = False
Transparent = False
Caption = ''
sollte das auch können.
Einfach Width schrittweise bis auf 0 verringern.

fisipjm 31. Mai 2022 10:00

AW: ProgressBar für Perfektionisten
 
XE3 ist halt schon ein paar Jährchen alt. Bei was aktuellerem hätte ich die nahe gelegt, schau dir mal Skia4Delphi an.

himitsu 31. Mai 2022 10:23

AW: ProgressBar für Perfektionisten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hast du im Setup die "Beispiele" mit installiert?

Aber wie gesagt, soooo hübsch modern ist die Komponente nicht und du kannst das auch aus einer TPaintBox (OnPaint) oder TImage
oder aus zwei TShape und einem TPanel selber bauen. (alLeft+alClient und dann links das Width setzen)

https://delphi-prg.ru/komponent-delphi-gauge
https://www.google.com/search?q=delp...&tbm=isch&sa=X
https://docwiki.embarcadero.com/Libr....Gauges.TGauge

selber bauen: https://www.codetd.com/article/1056245

Dabei hatte Delphi mal sooo coole Fortschrittsanzeigen.
Anhang 55122

TurboMagic 31. Mai 2022 12:24

AW: ProgressBar für Perfektionisten
 
Zitat:

Zitat von NicoleWagner (Beitrag 1506539)
Danke für alle Antworten.
Mein Delphi (XE3) zeigt mir leider kein "TGauge".

Wäre es Web, dann würde ich Folgendes tun: Ich würde eine Grafik von ein paar grünen Pixeln erzeugen und diese Grafik über die ganze Breite aufspannend also zerren. Geht das bei Delphi auch?
D.h. ich schreibe nicht: ProgressBar1.Position:=ProgressBar1.Position - 1;
sondern: Grafik1.Width:=Grafik1.Width - 1;

Spricht da von der Performance her etwas dagegen? Denn vermutlich muss ich da alle Sekunden (auf die mein Timer eingestellt ist) ein "Refresh" nachschieben.
Und wenn es Euch günstig erscheint, welche Komponente verwende ich dafür am Besten?

Mittels einer Paintbox könntest du was selber zeichnen.

NicoleWagner 31. Mai 2022 14:59

AW: ProgressBar für Perfektionisten
 
Ein PANEL!
Das ist genial, danke!

Habe jetzt zwei Panels übereinandergelegt. Das eine (hintere) grau, das andere (vordere) dunkelgrün.
Das dunkelgrüne wird immer enger (width:=width - 1) und gibt dabei die Ansicht aufs graue Panel dahinter schrittweise frei.
So sieht es aus wie ein Progress Bar, dessen Länge immer kürzer wird.
Count-Down-Progressbar mit einfachsten Mitteln.

Und es ist auch noch einfacher zu bedienen als diese ProgressBar-Stepby-Methoden.
Und optisch eleganter als das froschgrüne Blinken.
Ressourcenschonend ist es auch.

Ganz lieben Dank für die Idee!

himitsu 31. Mai 2022 15:16

AW: ProgressBar für Perfektionisten
 
Wie gesagt "CountDown" müsste doch auch mit einer ProgrssBar gehen, oder nicht?

So weit bekannt, wird die Animation nur von links nach rechts gemacht,
aber nicht von rechts nach links, was somit sofort an der richtigen Stelle zeichnen müsste.

[edit]
jupp, ist so
Delphi-Quellcode:
// Intervall = 1500
procedure TForm8.Timer1Timer(Sender: TObject);
begin
  if ProgressBar1.Position = 20 then
    ProgressBar1.Position := 80
  else
    ProgressBar1.Position := 20;
end;
[/edit]

mmw 31. Mai 2022 16:22

AW: ProgressBar für Perfektionisten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
evtl. ist hier was dabei

Delphi-Quellcode:

TcyProgressionPanel
https://sourceforge.net/projects/tcycomponents/

http://tcycomponents.sourceforge.net/

https://github.com/jackdp/JPPack

Delphi-Quellcode:

als schnelles Beispiel.

var i:Integer;

begin
 cyProgressionPanel1.Open;
 cyProgressionPanel1.GetLabel.Alignment:=taLeftJustify;
 cyProgressionPanel1.GetLabel.Caption:='Fortschritt';
// ProgressionPanel1.GetGauge
 i:=0;

 while not cyProgressionPanel1.Canceled do begin
   cyProgressionPanel1.GetGauge.Position:=i;
    Inc(i);
    if i>round(cyProgressionPanel1.GaugeMax) then i:=round(cyProgressionPanel1.GaugeMin);
    application.ProcessMessages;
 end;
 // cyProgressionPanel1.Close;
 end;

Gruß

NicoleWagner 31. Mai 2022 18:33

AW: ProgressBar für Perfektionisten
 
Danke für die weiteren Antworten.
Die Lösung, die mir am besten gefiel, postete ich in #15

mytbo 31. Mai 2022 21:46

AW: ProgressBar für Perfektionisten
 
Zitat:

Zitat von NicoleWagner (Beitrag 1506565)
Habe jetzt zwei Panels übereinandergelegt.

Das ist eine valide Methode seit den Anfangstagen von Delphi. Um die Funktionalität deiner ProgressBar vom Rest des Sourcecodes zu trennen, solltest du dir ruhig ein paar Minuten Zeit nehmen. Ein weiterer Vorteil wäre auch, dass ein besonders zum Aufhübschen talentierter Kollege sich voll austoben kann, ohne mit anderen Teilen in Berührung zu kommen. Die Technik ist weitläufig anwendbar, außerdem einfach und schnell umzusetzen.

Disclaimer: Das Beispiel ist ein Proof of Concept, der Sourcecode ist weder getestet noch optimiert.
Delphi-Quellcode:
type
  TProgressBarGUIHelper = class(TComponent)
  strict private
    FPaintBox: TPaintBox;
    FStepWidth: Double;
  private
    FPosition: Integer;
    FStepCount: Integer;
    procedure InitInternalControls;
    procedure RecalcStepWidth;
    procedure DoPaint(pmSender: TObject);
    procedure DoResize(pmSender: TObject);
  public
    constructor Create(pmOwner: TComponent; pmStepCount: Integer = 100); reintroduce;
    procedure StepReset(pmStartPosition: Integer = 0);
    procedure StepUp;
    procedure StepDown;
    property StepCount: Integer
      read FStepCount;
  end;

constructor TProgressBarGUIHelper.Create(pmOwner: TComponent; pmStepCount: Integer);
begin
  Assert(pmOwner is TPanel);
  inherited Create(pmOwner);
  FStepCount := pmStepCount;
  InitInternalControls;
  RecalcStepWidth;
end;

procedure TProgressBarGUIHelper.InitInternalControls;
begin
  with TPanel(Owner) do
  begin
    Caption := '';
    BevelKind := bkFlat;
    BevelOuter := bvNone;
    BevelInner := bvLowered;
    OnResize := DoResize;
  end;

  FPaintBox := TPaintBox.Create(Owner);
  FPaintBox.Parent := TPanel(Owner);
  FPaintBox.Align := alClient;
  FPaintBox.Color := clGreen;
  FPaintBox.OnPaint := DoPaint;
end;

procedure TProgressBarGUIHelper.RecalcStepWidth;
begin
  FStepWidth := FPaintBox.ClientWidth / FStepCount;
end;

procedure TProgressBarGUIHelper.DoPaint(pmSender: TObject);
var
  rect: TRect;
begin
  if FPosition = 0 then Exit; //=>

  with TPaintBox(pmSender) do
  begin
    if FPosition < FStepCount then
      rect.Create(0, 0, Trunc(FPosition * FStepWidth), ClientHeight)
    else
      rect.Create(ClientRect);

    Canvas.Rectangle(rect);
  end;
end;

procedure TProgressBarGUIHelper.DoResize(pmSender: TObject);
begin
  RecalcStepWidth;
end;

procedure TProgressBarGUIHelper.StepReset(pmStartPosition: Integer);
begin
  if pmStartPosition < 0 then
    FPosition := 0
  else if pmStartPosition > FStepCount then
    FPosition := FStepCount
  else
    FPosition := pmStartPosition;

  FPaintBox.Repaint;
end;

procedure TProgressBarGUIHelper.StepDown;
begin
  if FPosition > 0 then
  begin
    Dec(FPosition);
    FPaintBox.Repaint;
  end;
end;

procedure TProgressBarGUIHelper.StepUp;
begin
  if FPosition < FStepCount then
  begin
    Inc(FPosition);
    FPaintBox.Repaint;
  end;
end;
Im Formular lässt es sich dann so einsetzen:
Delphi-Quellcode:
TfrmMain = class(TForm)
  pnlProgressBar: TPanel;
private
  FProgressBarGUIHelper: TProgressBarGUIHelper;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  FProgressBarGUIHelper := TProgressBarGUIHelper.Create(pnlProgressBar);
end;
...
FProgressBarGUIHelper.StepUp;
Bis bald...
Thomas

himitsu 31. Mai 2022 23:29

AW: ProgressBar für Perfektionisten
 
Warum nicht pmOwner direkt als TPanel, wenn es sowieso ein TPanel sein muß?

Diese Komponente im Release kompiliert, knallt der Code, aber nicht da wo du denkst, denn das Assert arbeitet dort garnicht.




PS: Warum nicht von TPaintBox bzw. besser noch von TGraphicControl abgeleitet, anstatt diesen Umwegen?

freimatz 1. Jun 2022 08:59

AW: ProgressBar für Perfektionisten
 
Hallo zusammen,
SCNR - das "Perfektionisten" springt mich an. Vielleicht wäre es gut zu definieren was man unter perfekt versteht.
Für mich ist eine Anwendung unter den hier erörterten Aspekten perfekt wenn Sie den vom Hersteller des Betriebsystems (hier wohl Microsoft) vorgegebenen Guidlines entspricht. Das gilt auch für eine Progressbar.

mytbo 1. Jun 2022 11:58

AW: ProgressBar für Perfektionisten
 
Hallo himitsu!
Zitat:

Zitat von himitsu (Beitrag 1506594)
Warum nicht pmOwner direkt als TPanel, wenn es sowieso ein TPanel sein muß?

Es ging mir nicht darum, eine Copy-Paste Lösung zu präsentieren, nicht um diese Uhrzeit, sondern ein Konzept aufzuzeigen, wie man vollgestopfte Formulare verhindern kann. Und solche Formulare dürften die meisten von uns schon einmal gesehen haben. Die Auswahl der Komponenten hat sich aus den Vorschlägen der Vorposten ergeben und stellt keine persönliche Präferenz dar. Der Sinn ist, einen möglichen Umsetzungsvorschlag zu präsentieren.

Bis bald...
Thomas

KodeZwerg 1. Jun 2022 15:05

AW: ProgressBar für Perfektionisten
 
Zitat:

Zitat von freimatz (Beitrag 1506602)
Hallo zusammen,
SCNR - das "Perfektionisten" springt mich an. Vielleicht wäre es gut zu definieren was man unter perfekt versteht.
Für mich ist eine Anwendung unter den hier erörterten Aspekten perfekt wenn Sie den vom Hersteller des Betriebsystems (hier wohl Microsoft) vorgegebenen Guidlines entspricht. Das gilt auch für eine Progressbar.

Ich verstehe es auch nicht so ganz, wenn ich ein panel mit einem anderen farbigen control (panel, paintbox, whatever) habe und es anstelle hoch, runterzählen lasse, ist es doch das selbe als wenn ich es mit einer progressbar mache, also von 100 rückwärts zu 0 zählen lasse.
Bestimmt habe ich wieder was spannendes überlesen.

himitsu 1. Jun 2022 18:10

AW: ProgressBar für Perfektionisten
 
Nja, wenn es perfekt sein soll, dann müsste, bei einem Countdown, die Reflektionsanimation ja auch nach links laufen, wenn der Bar sich nach links bewegen soll. :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz