![]() |
TGauge ForeColor
Folgenden Code verwende ich, um die Hintergrund/Vordergrundfarbe eines gauges zu ändern (je nach Progress)
Delphi-Quellcode:
1. Ja es geht schöner, mit else und so, aber ich habs jetzt zum testen mal so gemacht
Gauge.Progress := Gauge.Progress + 1;
if Gauge.Progress > 20 then begin // vorher clBtnFace Gauge.BackColor := $0002FDCB; Gauge.ForeColor := $0002FDCB; end; if Gauge.Progress > 40 then begin // vorher clBtnFace Gauge.BackColor := $0000B3FF; Gauge.ForeColor := $0000B3FF; end; if Gauge.Progress > 60 then begin // vorher clBtnFace Gauge.BackColor := $000079FF; Gauge.ForeColor := $000079FF; end; if Gauge.Progress > 80 then begin // vorher clBtnFace Gauge.BackColor := $000053FF; Gauge.ForeColor := $000053FF; end; if Gauge.Progress > 100 then begin // vorher clBtnFace Gauge.BackColor := clRed; Gauge.ForeColor := clRed; end; 2. Bei wechseln der Farbe flackert das immer so schlimm. Kann man das nicht "sanfter" machen? |
Re: TGauge ForeColor
Ja mit dem Else ;-)
Bei 90 bspw. änderst du die Farbe 5 mal hintereinander... Und ein DoubleBuffered := true; würde auch noch helfen. |
Re: TGauge ForeColor
Zitat:
Delphi-Quellcode:
?
DoubleBuffered := True;
if Gauge.Progress > 80 then begin // vorher clBtnFace gauge.BackColor := $000053FF; gauge.ForeColor := $000053FF gauge.BackColor := $000053FF; gauge.ForeColor := $000053FF; gauge.BackColor := $000053FF; gauge.ForeColor := $000053FF; gauge.BackColor := $000053FF; gauge.ForeColor := $000053FF; gauge.BackColor := $000053FF; gauge.ForeColor := $000053FF; end; Was bewirkt das DoubleBuffered? |
Re: TGauge ForeColor
Nein. Nimm mal Deinen Source von oben und setze ein else vor die ifs (ab dem 2.). DoubleBuffered bewirkt, dass das Control eine Bitmap mit dem neuen grafischen Zustand im Speicher erzeugt und diese dann mit einem Schlag auf seinen Canvas zeichnet.
|
Re: TGauge ForeColor
Oder lass die ifs ganz weg und nimm case.
Delphi-Quellcode:
case Gauge.Progress of
0..19 : Machwas1; 20..39: Machwas2; 40..59: Machwas3; ... else Machwasganzanderes; end; |
Re: TGauge ForeColor
Delphi-Quellcode:
Ok, so ist es jetzt
Gauge.Progress := Gauge.Progress + 1;
DoubleBufferd := True; if Gauge.Progress > 20 then begin // vorher clBtnFace Gauge.BackColor := $0002FDCB; Gauge.ForeColor := $0002FDCB; end else if Gauge.Progress > 40 then begin // vorher clBtnFace Gauge.BackColor := $0000B3FF; Gauge.ForeColor := $0000B3FF; end else if Gauge.Progress > 60 then begin // vorher clBtnFace Gauge.BackColor := $000079FF; Gauge.ForeColor := $000079FF; end else if Gauge.Progress > 80 then begin // vorher clBtnFace Gauge.BackColor := $000053FF; Gauge.ForeColor := $000053FF; end else if Gauge.Progress > 100 then begin // vorher clBtnFace Gauge.BackColor := clRed; Gauge.ForeColor := clRed; end; Nur leider ist es so, dass mit dem else er die farbe nicht wechselt ;) |
Re: TGauge ForeColor
In dem Fall musst du zuerst auf > 100 prüfen, dann auf > 80 etc. pp. Denn größer als 20 ist alles, klar dass somit nur das erste ausgeführt wird.
|
Re: TGauge ForeColor
Klar, Du musst die Reihenfolge auch absteigend gestalten (hatte ich vergessen zu erwähnen). Wenn Progress > 80 ist er auch automatisch > 20, oder? :zwinker:
Aber die case-Lösung ist eh besser. :mrgreen: |
Re: TGauge ForeColor
Machs mit dem case ;-)
WEIL: Der erste Aufruf ist immer wahr sobald es größer 20 ist, ist es auch größer 40 usw. -> du kommst garnicht in das else |
Re: TGauge ForeColor
Dass das rückwerts geschrieben werden muss hätte mir auch einfallen können :wall: wtf..
Ist doch eigentlich auch logisch. Ich probiere es mal mit dem Case und gucke mit das DoubleBuffered was näher an. |
Re: TGauge ForeColor
Ok, soweit bin ich:
Delphi-Quellcode:
Nur der "Farbverlauf" sieht serh schlecht aus..
Gauge.Progress := Gauge.Progress + 1;
DoubleBuffered := true; case Gauge.Progress of 0..9 : Gauge.ForeColor := $0000AA00; 10..19 : Gauge.ForeColor := $0000AA82; 20..29 : Gauge.ForeColor := $0000AAC3; 30..39 : Gauge.ForeColor := $0000AAED; 40..49 : Gauge.ForeColor := $0000AAFF; 50..59 : Gauge.ForeColor := $00009AFF; 60..69 : Gauge.ForeColor := $000081FF; 70..79 : Gauge.ForeColor := $00006BFF; 80..89 : Gauge.ForeColor := $000058FF; 90..100: Gauge.ForeColor := $000000FF; end; Er ist nicht flüssig. Kann man sowas unkomplizierter lösen? |
Re: TGauge ForeColor
Hallo,
![]() Hoffe das hilft dir weiter. Du musst dann nur bei jeder Änderung der Gauge die Funktion entsprechend aufrufen, dir die Farbe holen, und auf den ForeColor (Die Gauge hat sicher ein entsprechendes Event?) zuweisen. |
Re: TGauge ForeColor
Ich habe mir das jezt mal angesehen, leider verstehe ich den Code nicht wirklich.
|
Re: TGauge ForeColor
Guck dir doch einfach mal den Funktionskopf an, mit etwas Überlegung siehst du gleich, was diese dann macht, ohne den Code gesehen zu haben.
Delphi-Quellcode:
ColStart: Anfangsfarbe
function LinearGradientStep(ColStart, ColEnd: TColor; Length, Step: Integer): TColor;
ColEnd: Endfarbe Length: Länge des farbverlaufs (Länge deiner Gauge) Step: Schrittweite Result: TColor Du erhälst somit einen Farbwert im Abhängigkeit der angegebenen Parameter. Das Vorgehen hat dir Luke bereits genannt. |
Re: TGauge ForeColor
muss ich
ColStart, ColEnd, Length und Step deklarieren? also so:
Delphi-Quellcode:
?
ColStart := clLime;
ColEnd := clRed; Lenght := '100'; Step := '1'; Zitat:
|
Re: TGauge ForeColor
Nein lediglich beim Funktionsaufruf übergeben. Du solltest dir einmal die Delphi-Grundlagen ansehen.
|
Re: TGauge ForeColor
Die gucke ich mir immerwieder mal an. Aber wenn ich es auf anhieb nicht verstehe kann ich nix machen..
Eine kleine Hilfe, z.B. CodeSchnipsel, würde mir helfen. |
Re: TGauge ForeColor
Zitat:
Ich würde es in der Art lösen (setzt voraus, dass Width > MaxValue ist):
Delphi-Quellcode:
Frag mich bitte nicht, wieso am Ende so ein Farbsprung stattfindet. :gruebel:
var
i: Integer; begin for i := 1 to Gauge.MaxValue do begin Gauge.Progress := i; Gauge.ForeColor := LinearGradientStep(clGreen, clBlue, Gauge.Width, i * round(Gauge.Width / Gauge.MaxValue)); Delay(40); end; end; |
Re: TGauge ForeColor
Achso, die Funktion kann biszu 4 Werte aufnehmen?
Mh.. soetwas habe ich gestern noch in einem Buch durchgelesen, da ging es halt aber um Canvas |
Re: TGauge ForeColor
|
Re: TGauge ForeColor
Zitat:
EDIT: Hab mir meine funktion nochmal angesehen. die geht eigentlich strikt linear durch, nur beim runden könnts zwischendurch mal größere sprünge geben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:59 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 by Thomas Breitkreuz