![]() |
Prozentualer Fortschritt als Text in ProgressBar...
Ich würde gern den prozentualen Fortschritt als Text in der Mitte einer Progressbar anzeigen. Ich weiß, das TGauge das kann, jedoch wird diese nicht von der von mir verwendeten Skinengine (suiskin) "geskinnt", weshalb ich den Text nun gern irgendwie auf eine normale Progressbar packen würde :gruebel:
|
Re: Prozentueller Fortschritt als Text in ProgressBar...
Hi,
du könntest über Canvas draufmalen. Ansonsten könntest du auch noch gucken, ob das PSDK irgendwas hergibt in diese Richtung. Zum Beispiel irgendeine Nachricht, die das automatisch macht, die aber nicht von der VCL gekapselt wurde oder sowas. Chris |
Re: Prozentualer Fortschritt als Text in ProgressBar...
Einfach auf den Canvas der Progressbar schreiben:
Delphi-Quellcode:
Man müsste das natürlich noch verfeinern, damit er eine andere Farbe für die Schrift nimmt, wenn der balken unter dem Text liegt. Aber etwas kannst du ja auch selber machen. ;)
procedure foo(Progressbar: TProgressbar; const Text: String);
var dc: HDC; rect: TRect; begin dc := GetWindowDC(Progressbar.Handle); GetClientRect(Progressbar.Handle, rect); SetBkMode(dc, TRANSPARENT); DrawText(dc, PChar(Text), length(Text), rect, DT_SINGLELINE or DT_VCENTER or DT_CENTER); InvalidateRect(Progressbar.Handle, @rect, True); end; |
Re: Prozentualer Fortschritt als Text in ProgressBar...
Danke Luckie ;)
Ich hab den Code noch etwas angepasst...
Delphi-Quellcode:
Die procedure rufe ich nun bei jedem Setzen der Position auf. 3 Probleme hab ich allerdings noch:
procedure TDupFind_Main.WritePercent(Progressbar: TProgressbar);
var dc: HDC; rect: TRect; Text: string; begin if (ProgressBar.Max = 0) or (ProgressBar.Position = 0) then Text := '0%' else if ProgressBar.Max = ProgressBar.Position then Text := '100%' else Text := IntToStr(Trunc(100 / ProgressBar.Max * ProgressBar.Position)) + '%'; dc := GetWindowDC(Progressbar.Handle); rect := ProgressBar.ClientRect; SetBkMode(dc, TRANSPARENT); DrawText(dc, PChar(Text), length(Text), rect, DT_SINGLELINE or DT_VCENTER or DT_CENTER); InvalidateRect(Progressbar.Handle, @rect, True); end; 1. Wie ändere ich die Textfarbe? "SetDCBrushColor(dc,clred);" funktioniert jedenfalls nicht... 2. Wie ändere ich den Textstyle? Jetzt ist der Text immer Fett... 3. Es ist alles stark am Flimmern. Bei jedem neuzeichnen des Progressbar wird der Text wieder weggebügelt |
Re: Prozentualer Fortschritt als Text in ProgressBar...
1.:
![]() 2.: ![]() ![]() 3.: Bei meinem Code flackert nichts, auch wenn sie schnell läuft. Nachtrag: Dein Code flackert bei mir auch nicht. Löst du irgendwo anders noch irgendwelche Repaints aus? |
Re: Prozentualer Fortschritt als Text in ProgressBar...
Moin,
alternativ gibt es auch eine fertige Komponente (im Reiter Beispiele) -> Gauge. MfG Thorsten |
Re: Prozentualer Fortschritt als Text in ProgressBar...
Hi,
Zitat:
Chris |
Re: Prozentualer Fortschritt als Text in ProgressBar...
Ups, sorry - du hast recht
|
Re: Prozentualer Fortschritt als Text in ProgressBar...
Zitat:
1. und 2. hab ich hinbekommen. 3. Der Code flackert Doch! Also hier ist nun meine aktuelle procedure:
Delphi-Quellcode:
Der Aufruf erfolgt bei mir so:
procedure TDupFind_Main.WritePercent(Progressbar: TProgressbar);
var dc: HDC; myfont: Cardinal; rect: TRect; Text: string; begin if (ProgressBar.Max = 0) or (ProgressBar.Position = 0) then Text := '0%' else if ProgressBar.Max = ProgressBar.Position then Text := '100%' else Text := IntToStr(Trunc(100 / ProgressBar.Max * ProgressBar.Position)) + '%'; dc := GetWindowDC(Progressbar.Handle); myfont := CreateFont(-12, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, 'Verdana'); SetBkMode(dc, TRANSPARENT); SetTextColor(dc, clBlack); SelectObject(dc, myfont); rect := ProgressBar.ClientRect; SetBkMode(dc, TRANSPARENT); DrawText(dc, PChar(Text), length(Text), rect, DT_SINGLELINE or DT_VCENTER or DT_CENTER); InvalidateRect(Progressbar.Handle, @rect, True); end;
Delphi-Quellcode:
Beim Setzen der Position wird die Progressbar neu gezeichnet und damit mein Text überzeichnet, durch das anschließende neu schreiben des Textes entsteht ein ziemlich nerviger Flimmereffekt...
ProgressBar1.Position := FCnt;
WritePercent(ProgressBar1); |
Re: Prozentualer Fortschritt als Text in ProgressBar...
wer zuletzt kommt... folge dem Link...
![]() Kann auch % Text Darstellen und ist bei den Farben variabel. |
Re: Prozentualer Fortschritt als Text in ProgressBar...
Ich hab gerade mal die folgende Zeile rausgenommen:
Delphi-Quellcode:
Jetzt ist das Flimmern weg :-D :roll:
InvalidateRect(Progressbar.Handle, @rect, True);
|
Re: Prozentualer Fortschritt als Text in ProgressBar...
Tut mir leid, das kann ich nicht bestätigen. Und ich habe dir doch geasgt, du sollst die Schrift einmal setzen und nicht jedes mal, wenn du den Text setzt. Hm, das scheint irgendwie nicht so ganz zu funktionieren, zumindest im OnCreate der Form nicht.
Dann löst du irgendwo anders noch ein Repaint oder Refresh aus, was dann natürlich doppelt ist. Ich brauche das, weil sonst der Text nur ein schwarzen Rechteck ist. |
Re: Prozentualer Fortschritt als Text in ProgressBar...
Zitat:
|
Re: Prozentualer Fortschritt als Text in ProgressBar...
Zitat:
|
Re: Prozentualer Fortschritt als Text in ProgressBar...
Was für eine Farbe hat denn dein Fortschrittsbalken? Ach so, zum Schluss bitte noch
![]() |
Re: Prozentualer Fortschritt als Text in ProgressBar...
Zitat:
Delphi-Quellcode:
TQProgressBar = class(TCustomControl)
|
Re: Prozentualer Fortschritt als Text in ProgressBar...
Zitat:
![]() |
Re: Prozentualer Fortschritt als Text in ProgressBar...
Könntest du nicht einfach die WM_PAINT-Message der Progressbar abfangen (WndProc umbiegen ?), weitersenden, und dann nochmal deine Prozentzahl draufpinseln ?
(Dann wäre die Zeit ohne Prozentzahl am geringsten) |
Re: Prozentualer Fortschritt als Text in ProgressBar...
Zitat:
|
Re: Prozentualer Fortschritt als Text in ProgressBar...
Hab ich auch ;) wenn ich z.B: clRed verwende, dann wird die Schrift auch rot...
|
Re: Prozentualer Fortschritt als Text in ProgressBar...
Ja, nee, schon klar. ;)
Ich meine, wenn der Balken hinter der Schrift ist, dass sie dann die Farbe wechselt, dass man sie noch lesen kann. |
Re: Prozentualer Fortschritt als Text in ProgressBar...
Das Problem habe ich nicht... der Balken hat ja eine Farbe, wo man die Schrift genauso sieht wie auf dem Hintergrund ;)
|
Re: Prozentualer Fortschritt als Text in ProgressBar...
Und alle ignorieren Sie mich :? :evil: :cry:
(Schon das 2. Thema in dieser Woche ...) So geht es: (zumindest bei mir)
Delphi-Quellcode:
Weitestgehend ohne Flimmern, ich habs jetzt aber nicht mit suiskin (oder wie das heißt) ausprobiert ...
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, xpman; type TForm1 = class(TForm) ProgressBar1: TProgressBar; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } OldProgressWndProc: TWndMethod; procedure ProgressWndProc(var Msg: TMessage); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.ProgressWndProc(var Msg: TMessage); var dc: HDC; rect: TRect; begin OldProgressWndProc (Msg); if Msg.Msg = WM_PAINT then // Wenn die Progressbar neugezeichnet wurde, // und somit die Zahl weg ist: Prozentzahl neu draufpinseln begin dc := GetWindowDC(Progressbar1.Handle); Windows.GetClientRect(Progressbar1.Handle, rect); SetBkMode(dc, TRANSPARENT); DrawText(dc, PChar(Text), length(Text), rect, DT_SINGLELINE or DT_VCENTER or DT_CENTER); // vll. noch ReleaseDC(Progressbar1.Handle, dc); end; end; procedure TForm1.FormCreate(Sender: TObject); begin OldProgressWndProc := ProgressBar1.WindowProc; ProgressBar1.WindowProc := ProgressWndProc; end; procedure TForm1.Button1Click(Sender: TObject); begin repeat ProgressBar1.StepIt; Application.ProcessMessages; Sleep (50); until ProgressBar1.Position = 100; end; end. |
Re: Prozentualer Fortschritt als Text in ProgressBar...
Warum der Umstand? Aber gut, so geht es auch.
|
Re: Prozentualer Fortschritt als Text in ProgressBar...
Ich kenne jetzt nicht diese Skinkompo, aber so wird die Prozentzahl immer draufgepinselt, und nicht nur, wenn er .StepIt aufruft und dann die Prozentzahl neu draufmalt ;)
(Sie könnte sich ja zwischendurch neuzeichnen) |
Re: Prozentualer Fortschritt als Text in ProgressBar...
jfheins: Ich hab jetzt mal Deinen Code getestet... das Problem ist nur, dass mein Progressbar niemals die Message WM_PAINT bekommt...
|
Re: Prozentualer Fortschritt als Text in ProgressBar...
Also, jetzt hab ich's hinbekommen...
Delphi-Quellcode:
WM_PAINT hab ich zwar drin gelassen, aber diese Message ist bei meinen Tests noch nie bei meiner Progressbar angekommen. Die relevante Message ist 1026, was das für eine Message sein soll hab ich noch nicht rausbekommen...
if (Msg.Msg = 1026) or (Msg.Msg = WM_PAINT) then
|
Re: Prozentualer Fortschritt als Text in ProgressBar...
Für faule Leute wie mich :angel2: gibt es auch die Bars aus der JEDI-VCL.
Bei manchen steht der Fortschritt auch drauf. |
Re: Prozentualer Fortschritt als Text in ProgressBar...
Soweit läuft ja jetzt alles schonmal ganz gut...
Wenn ich allerdings die SkinEngine deaktiviere, wird der Hintergrund der Progressbar nätürlich nicht aktualisiert und das ganze sieht dann so aus: ![]() Wenn ich "SetBkMode(dc, TRANSPARENT);" deaktiviere kann man den Text zwar lesen, aber man hat natürlich einen weißen Hintergrund: ![]() Wenn ich nun vorher "InvalidateRect(Progressbar1.Handle, @rect, True);" aufrufe gibt es ein fürchterliches geflimmer... |
Re: Prozentualer Fortschritt als Text in ProgressBar...
mal 'ne blöde Zwischenfrage:
Wenn das mit deiner Skin - Kompo so derbe Probleme gibt, warum packst du die Prozentzahl als Label denn nicht neben die Progressbar? |
Re: Prozentualer Fortschritt als Text in ProgressBar...
MIT der Kompo gibt's ja gerade keine Probleme ;)
![]() nur wenn die Kompo nicht Aktiv ist, also OHNE Kompo gibts Probleme: ![]() |
Re: Prozentualer Fortschritt als Text in ProgressBar...
:x Irgend etwas an meiner procedure "frisst" Systemresourcen... Der Speicherverbrauch ist normal, aber es kommt auf einigen Rechnern zu Abstürzen mit der Meldung "Systemresourcen erschöpft". Wenn ich die procedure nicht benutze indem ich das "Umbiegen" der WndProc auskommentiere tritt das Problem nicht mehr auf :?
Delphi-Quellcode:
procedure TTest_Main.FormCreate(Sender: TObject);
var ... begin ... OldProgressWndProc := ProgressBar1.WindowProc; ProgressBar1.WindowProc := ProgressWndProc; ... end; procedure TTest_Main.ProgressWndProc(var Msg: TMessage); var dc: HDC; rect: TRect; myfont: Cardinal; Text: string; begin OldProgressWndProc(Msg); if ((Msg.Msg = 1026) or (Msg.Msg = WM_PAINT)) and (ProgressBar1.Min = 0) then // Wenn die Progressbar neugezeichnet wurde, // und somit die Zahl weg ist: Prozentzahl neu draufpinseln begin if (ProgressBar1.Max = 0) or (ProgressBar1.Position = 0) then Text := '0%' else if ProgressBar1.Max = ProgressBar1.Position then Text := '100%' else Text := IntToStr(Trunc(100 / ProgressBar1.Max * ProgressBar1.Position)) + '%'; dc := GetWindowDC(Progressbar1.Handle); try rect := ProgressBar1.ClientRect; //InvalidateRect(Progressbar1.Handle, @rect, True); myfont := CreateFont(-11, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, 'Verdana'); if suiSkinEngine1.Active = True then SetBkMode(dc, TRANSPARENT); SetTextColor(dc, clBlack); SelectObject(dc, myfont); DrawText(dc, PChar(Text), length(Text), rect, DT_SINGLELINE or DT_VCENTER or DT_CENTER); finally ReleaseDC(Progressbar1.Handle, dc); end; end; end; |
Re: Prozentualer Fortschritt als Text in ProgressBar...
Zu jedem SelectObject gehört auch ein
![]() |
Re: Prozentualer Fortschritt als Text in ProgressBar...
:oops: :wall: ja wo er recht hat, hat er recht der Luckie ;), Danke
|
Re: Prozentualer Fortschritt als Text in ProgressBar...
Bisher lief alles wunderbar... Jetzt kam ein Update der Skin-Komponente und nun wird mein drüber gemalter Test immer wieder gelöscht (flackern) :?
Hat jemand eine Idee, wie ich sofort nach dem Neuzeichnen meinenText wiederdrübergebügelt bekomme, ohne dass es fackert? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 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