Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Textfarbe faden (https://www.delphipraxis.net/20283-textfarbe-faden.html)

Thorben86 15. Apr 2004 15:25


Textfarbe faden
 
Hi, ich will bei die Textfarbe von zb nem Label , welche bei mir am anfang die standartfarbe hat(die graue Form-Farbe), auf schwarz faden, also dass se durch nen timer langsam verändert wird. Mein Problem ist nun, dass ich nicht weis, wie ich das näher ans schwarze rankrieg, da ja auch buchstaben drin sind (zB. $00E7B6C6). Oder kann man den Farbwert noch anders mitteilen, was einfacher wäre, zu faden?

dizzy 15. Apr 2004 15:37

Re: Textfarbe faden
 
Mach's so:

Delphi-Quellcode:
Label1.Color := rgb(rotWert, gruenWert, blauWert);
rotWert bis blauWert sind vom Typ Byte, und 0 ist ganz Dunkel, 255 ganz Hell. Wenn alle 3 Werte gleich sind, hast du Graustufen.

gruss,
dizzy

nTE 15. Apr 2004 15:39

Re: Textfarbe faden
 
Das $ vorne steht dafür, dass der Wert Hexadezimal notiert ist, daher die Buchstaben. :P

Im Endeffekt kannst du ganz leicht schwarz faden, indem du die Werte für RGB (Delphi notiert sie BGR soweit ich weiß) gleichmäßig an Null annäherst.

Der Wert schlüsselt sich so auf:
$00BBGGRR, d.h. ein Byte (0-255) für jeden Farbanteil.

Um diesen zu verringern könntest du einfach einfach
Delphi-Quellcode:
LabelFade.Font.Color := LabelFade.Font.Color - (1 shl 16) - (1 shl 8) - 1;
In den Timer einbinden.
(Eine Überprüfung ob der Wert nicht schon kleiner als 0 (also $00000000 für Schwarz) ist, müsste sicherheitshalber natürlich auch dazu.)

Falls du dich jetzt fragst was shl macht:

SHL = shift left (Schiebe links)
Das ist eine binäre Operation, d.h. 1 shl 1 wäre 2 weil 0001b eins nach links geschoben 0010b also 2 dezimal wäre.

1 SHL 8 schiebt die eins also an die Stelle wo das neue Byte anfängt (in diesem Falle das für Grün) und 1 SHL 16 logischerweise an die Stelle wo Blau anfängt.
Damit kannst du dir schwieriges (Kopf-)Rechnen sparen und hältst den Code leichter verständlich. :P


Ich hoffe natürlich, dass du dich mit den Zahlensystemen Hexadezimal und Binär schon ein wenig auskennst. ^^

Thorben86 15. Apr 2004 16:08

Re: Textfarbe faden
 
Also theoretisch klappt der code, nur hab ich das problem, dass wenn das Label am anfang eine Farbe wie z.b. clBtnFace oder andere Formen davon, ausgenommen den werten wie clBlue usw. hat, dass das direkt schwarz wird. Sonst fadet der.

Delphi-Quellcode:
procedure Tf_strasse.Timer1Timer(Sender: TObject);
begin
if(label3.color<>$00000000) then
Label3.Color := Label3.Color - (1 shl 16) - (1 shl 8) - 1
else
timer1.enabled:=false;
end;


procedure Tf_strasse.FormCreate(Sender: TObject);
begin
//label3.color:= rgb(212,208,200);
 end;
Wenn ich den Teil aktiviere, der beim starten der Form ausgeführt wird, klappt es, obwohl das genau der Farbwert ist, den clBtnFace hat. Kann mir jemand sagen warum der dass macht?

dizzy 15. Apr 2004 17:03

Re: Textfarbe faden
 
Bei:
Delphi-Quellcode:
Label3.Color := Label3.Color - (1 shl 16) - (1 shl 8) - 1
würd ich eher:
Delphi-Quellcode:
Label3.Color := ColorToRGB(Label3.Color) - (1 shl 16) - (1 shl 8) - 1
TColor speichert bekannte Farben "cl*" soweit ich weiss nicht als Farbwert, sondern als den Namen "cl*". Daher musst du erst Umwandeln!

und:
1 shl 16 = 65536
1 shl 8 = 256
sparst dir damit 2 Berechungen.

\edit: Noch besser:
(1 shl 16) - (1 shl 8) - 1 = 65536 - 256 - 1 = 65279
Dann erkennt zwar kein Mensch merh, was su da machst, aber nu ;)
Aber besser meinen Beitrag hier drunter anschauen *g*.



gruss,
dizzy

dizzy 15. Apr 2004 17:09

Re: Textfarbe faden
 
Nochwas!!!

Wenn du mit "nicht-grauen" Farben arbeitest, kann das recht unschön werden! Mein Tipp:

Delphi-Quellcode:
var
  r,g,b : Integer;
  c : LongInt; // Color ist ein LongInt !
.
.
.
c := ColorToRGB(Label1.Color);

r := GetRValue(c)-1;
if r <  0 then r :=  0; // Bereichsprüfung, sonst wird's unschön!
if r > 255 then r := 255; // Bereichsprüfung, sonst wird's unschön!

g := GetGValue(c)-1;
if g <  0 then g :=  0; // Bereichsprüfung, sonst wird's unschön!
if g > 255 then g := 255; // Bereichsprüfung, sonst wird's unschön!

b := GetBValue(c)-1;
if b <  0 then b :=  0; // Bereichsprüfung, sonst wird's unschön!
if b > 255 then b := 255; // Bereichsprüfung, sonst wird's unschön! ;)

Label1.Color := rgb(r, g, b);
Da du aber nur subtrahierst, und auch immer nur 1, reicht folgendes:
Delphi-Quellcode:
var
  r,g,b : Byte;
  c : LongInt; // Color ist ein LongInt !
.
.
.
c := ColorToRGB(Label1.Color);

if GetRValue(c) > 0 then r := GetRValue(c)-1;
if GetGValue(c) > 0 then g := GetGValue(c)-1;
if GetBValue(c) > 0 then b := GetBValue(c)-1;

Label1.Color := rgb(r, g, b);
gruss,
dizzy

glkgereon 15. Apr 2004 19:41

Re: Textfarbe faden
 
warum stellst du nicht als anfangsfarbe 'black' ein??? :gruebel:

Thorben86 15. Apr 2004 20:56

Re: Textfarbe faden
 
@ glkbkk: Willste von schwarz auf schwarz faden, oder weist du nicht, was faden heißt?

glkgereon 15. Apr 2004 21:04

Re: Textfarbe faden
 
achso, ich hab mir noch mal wort für wort alles durchgelesen, jetzt hab ichs verstanden... :-D

also, ich würds so machen:

Delphi-Quellcode:
{also, ich gehe von dieser farbe aus 212,208,200,
und davon, das dass ein rgb, und kein grb ist, sonst muss man es halt umstellen...}

repeat
blau:=blau+1;//symbolisch
until blau=rot;

repeat
gruen:=gruen+1;
until gruen=rot;

//bis hier wird sichergestellt, das es ein echtes grau ist, dann dies:

for rot:=rot downto 0 do
     begin
     gruen:=rot;
     blau:=rot;
     sleep(100);//oder halt mehr, oder weniger....
     end;

//so, das wärs

dizzy 15. Apr 2004 22:10

Re: Textfarbe faden
 
Warum sollte man Blau und Grün erst mit Rot gleichziehen, um ne Graustufe draus zu machen? Und warum in einer Schleife :?: Wenn dann soch grün := rot bzw. blau := rot...

Aber es ist trotzdem Unsinn! Man kann doch, wie ich's oben schrieb, von JEDER Farbe aus faden!? Man könnte sogar noch pingeliger werden, und es so biegen, dass dass alle 3 Werte im gleichen Zyklus die 0 erreichen! DANN wäre es perfekt ;)


gruss,
dizzy


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:48 Uhr.
Seite 1 von 2  1 2      

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