AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ProgressBar für Perfektionisten

Ein Thema von NicoleWagner · begonnen am 28. Mai 2022 · letzter Beitrag vom 1. Jun 2022
Antwort Antwort
Seite 2 von 3     12 3      
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
480 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: ProgressBar für Perfektionisten

  Alt 31. Mai 2022, 08:50
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.
Bernd

Geändert von BerndS (31. Mai 2022 um 08:55 Uhr)
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#12

AW: ProgressBar für Perfektionisten

  Alt 31. Mai 2022, 10:00
XE3 ist halt schon ein paar Jährchen alt. Bei was aktuellerem hätte ich die nahe gelegt, schau dir mal Skia4Delphi an.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#13

AW: ProgressBar für Perfektionisten

  Alt 31. Mai 2022, 10:23
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.
delphi1install.jpg
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (31. Mai 2022 um 10:37 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.825 Beiträge
 
Delphi 12 Athens
 
#14

AW: ProgressBar für Perfektionisten

  Alt 31. Mai 2022, 12:24
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.
  Mit Zitat antworten Zitat
NicoleWagner

Registriert seit: 6. Jul 2010
167 Beiträge
 
Delphi XE3 Professional
 
#15

AW: ProgressBar für Perfektionisten

  Alt 31. Mai 2022, 14:59
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!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#16

AW: ProgressBar für Perfektionisten

  Alt 31. Mai 2022, 15:16
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]
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (31. Mai 2022 um 15:18 Uhr)
  Mit Zitat antworten Zitat
mmw

Registriert seit: 10. Sep 2019
Ort: OWL
324 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: ProgressBar für Perfektionisten

  Alt 31. Mai 2022, 16:22
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ß
Miniaturansicht angehängter Grafiken
pic1.png  

Geändert von mmw (31. Mai 2022 um 16:44 Uhr)
  Mit Zitat antworten Zitat
NicoleWagner

Registriert seit: 6. Jul 2010
167 Beiträge
 
Delphi XE3 Professional
 
#18

AW: ProgressBar für Perfektionisten

  Alt 31. Mai 2022, 18:33
Danke für die weiteren Antworten.
Die Lösung, die mir am besten gefiel, postete ich in #15
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
461 Beiträge
 
#19

AW: ProgressBar für Perfektionisten

  Alt 31. Mai 2022, 21:46
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

Geändert von mytbo (31. Mai 2022 um 22:07 Uhr) Grund: Ups, da war ein Paint zu viel
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#20

AW: ProgressBar für Perfektionisten

  Alt 31. Mai 2022, 23:29
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 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