Delphi-PRAXiS

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.

Tommy1988 7. Jun 2007 10:48

Re: TGauge ForeColor
 
Ok, soweit bin ich:

Delphi-Quellcode:
  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;
Nur der "Farbverlauf" sieht serh schlecht aus..
Er ist nicht flüssig. Kann man sowas unkomplizierter lösen?

DGL-luke 7. Jun 2007 10:54

Re: TGauge ForeColor
 
Hallo,

hier habe ich Beispielcode gepostet, um die einzelnen Schritte eines linearen Farbverlaufs zu berechnen.

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.

Tommy1988 7. Jun 2007 10:57

Re: TGauge ForeColor
 
Ich habe mir das jezt mal angesehen, leider verstehe ich den Code nicht wirklich.

Matze 7. Jun 2007 11:02

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:
function LinearGradientStep(ColStart, ColEnd: TColor; Length, Step: Integer): TColor;
ColStart: Anfangsfarbe
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.

Tommy1988 7. Jun 2007 11:11

Re: TGauge ForeColor
 
muss ich
ColStart, ColEnd, Length und Step

deklarieren?

also so:
Delphi-Quellcode:
ColStart := clLime;
ColEnd := clRed;
Lenght := '100';
Step := '1';
?

Zitat:

Das Vorgehen hat dir Luke bereits genannt.
Wenn ich es verstanden hätte würd ich nicht mehr fragen

Matze 7. Jun 2007 11:12

Re: TGauge ForeColor
 
Nein lediglich beim Funktionsaufruf übergeben. Du solltest dir einmal die Delphi-Grundlagen ansehen.

Tommy1988 7. Jun 2007 11:16

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.

Matze 7. Jun 2007 11:25

Re: TGauge ForeColor
 
Zitat:

Zitat von Tommy1988
Eine kleine Hilfe, z.B. CodeSchnipsel, würde mir helfen.

Hehe, das glaube ich dir gern. :zwinker: Doch solltest du selbst mal etwas überlegen und versuchen, das umzusetzen.

Ich würde es in der Art lösen (setzt voraus, dass Width > MaxValue ist):

Delphi-Quellcode:
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;
Frag mich bitte nicht, wieso am Ende so ein Farbsprung stattfindet. :gruebel:

Tommy1988 7. Jun 2007 11:27

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

Matze 7. Jun 2007 11:29

Re: TGauge ForeColor
 
Natürlich kann sie das.

Schaue dir das hier mal an bzw. arbeite den Crashkurs durch, sonst bringt dir das alles nichts.

DGL-luke 7. Jun 2007 11:39

Re: TGauge ForeColor
 
Zitat:

Zitat von Matze
Frag mich bitte nicht, wieso am Ende so ein Farbsprung stattfindet. :gruebel:

...das nehm ich jetzt persönlich - als bugreport ;-)

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 00:58 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