Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TGauge ForeColor (https://www.delphipraxis.net/93540-tgauge-forecolor.html)

Tommy1988 7. Jun 2007 10:10


TGauge ForeColor
 
Folgenden Code verwende ich, um die Hintergrund/Vordergrundfarbe eines gauges zu ändern (je nach Progress)
Delphi-Quellcode:
  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;
1. Ja es geht schöner, mit else und so, aber ich habs jetzt zum testen mal so gemacht

2. Bei wechseln der Farbe flackert das immer so schlimm.

Kann man das nicht "sanfter" machen?

EDatabaseError 7. Jun 2007 10:17

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.

Tommy1988 7. Jun 2007 10:22

Re: TGauge ForeColor
 
Zitat:

Bei 90 bspw. änderst du die Farbe 5 mal hintereinander...

Und ein DoubleBuffered := true; würde auch noch helfen.
Also so:
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?

DeddyH 7. Jun 2007 10:24

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.

DeddyH 7. Jun 2007 10:26

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;

Tommy1988 7. Jun 2007 10:28

Re: TGauge ForeColor
 
Delphi-Quellcode:
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;
Ok, so ist es jetzt
Nur leider ist es so, dass mit dem else er die farbe nicht wechselt ;)

Matze 7. Jun 2007 10:30

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.

DeddyH 7. Jun 2007 10:30

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:

EDatabaseError 7. Jun 2007 10:30

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

Tommy1988 7. Jun 2007 10:31

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:36 Uhr.
Seite 1 von 3  1 23      

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