Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:01 Uhr.
Seite 2 von 3     12 3      

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