![]() |
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) |
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: ![]() 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. |
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. |
AW: ProgressBar für Perfektionisten
Evtl. gibt's hier auch was brauchbares zu dem Thema:
![]() Benötigt aber die Installation von: ![]() |
AW: ProgressBar für Perfektionisten
Es ist sicher Geschmackssache, aber auch bei einem Countdown würde ich den Fortschrittsbalken von links nach rechts bewegen.
|
AW: ProgressBar für Perfektionisten
|
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: ![]() 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. |
AW: ProgressBar für Perfektionisten
Zitat:
|
AW: ProgressBar für Perfektionisten
Joar, genau das, den "animierten" Bewegungspfad des Endes der Bar.
|
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? |
AW: ProgressBar für Perfektionisten
Ein TLabel mit den Eigenschaften
AutoSize = Falsesollte das auch können. Einfach Width schrittweise bis auf 0 verringern. |
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.
|
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) ![]() ![]() ![]() selber bauen: ![]() Dabei hatte Delphi mal sooo coole Fortschrittsanzeigen. Anhang 55122 |
AW: ProgressBar für Perfektionisten
Zitat:
|
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! |
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:
[/edit]
// Intervall = 1500
procedure TForm8.Timer1Timer(Sender: TObject); begin if ProgressBar1.Position = 20 then ProgressBar1.Position := 80 else ProgressBar1.Position := 20; end; |
AW: ProgressBar für Perfektionisten
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
evtl. ist hier was dabei
Delphi-Quellcode:
TcyProgressionPanel ![]() ![]() ![]()
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ß |
AW: ProgressBar für Perfektionisten
Danke für die weiteren Antworten.
Die Lösung, die mir am besten gefiel, postete ich in #15 |
AW: ProgressBar für Perfektionisten
Zitat:
Disclaimer: Das Beispiel ist ein Proof of Concept, der Sourcecode ist weder getestet noch optimiert.
Delphi-Quellcode:
Im Formular lässt es sich dann so einsetzen:
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;
Delphi-Quellcode:
Bis bald...
TfrmMain = class(TForm)
pnlProgressBar: TPanel; private FProgressBarGUIHelper: TProgressBarGUIHelper; procedure TfrmMain.FormCreate(Sender: TObject); begin FProgressBarGUIHelper := TProgressBarGUIHelper.Create(pnlProgressBar); end; ... FProgressBarGUIHelper.StepUp; Thomas |
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? |
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 ![]() |
AW: ProgressBar für Perfektionisten
Hallo himitsu!
Zitat:
Bis bald... Thomas |
AW: ProgressBar für Perfektionisten
Zitat:
Bestimmt habe ich wieder was spannendes überlesen. |
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 23:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz