Entwickler-Ecke

Multimedia / Grafik - Farbenwechsel


Headcracker - Mi 18.03.09 15:44
Titel: Farbenwechsel
Also ich habe folgendes Problem:
Ich möchte mit Hilfe des Timers erreichen, dass jede halbe Sekunde die Farbe des Formulars und die Schriftfarbe von 2 Buttons zwischen rot und schwarz wechselt.
Dabei gibt es jedoch ein seltsames Problem, was mich ziemlich verwirrt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm2.Timer1Timer(Sender: TObject);
begin
if Form2.Color:=clBlack then
  begin
    Form2.Color:=clRed;
    BitBtn1.Font.Color:=clBlack;
    BitBtn2.Font.Color:=clBlack;
  end
else
  begin
    Form2.Color:=clBlack;
    BitBtn1.Font.Color:=clRed;
    BitBtn2.Font.Color:=clRed;
  end;  
end;


Wie ihr seht, steht in der 3. Zeile ein Farbwert für die Farbe des Formulars als Bedingung. Wenn ich das Programm starten will, kommt allerdings die Fehlermeldung "Ausdruckstyp muss BOOLEAN sein". Für die nachfolgenden Form2.Color's werden keine Fehlermeldungen anzeigt.
Und ich hab noch nie gehört, dass eine simple if-then-Verzweigung unbedingt einen BOOLEAN-Wert in der Bedingung benötigt. Bei anderen Programmen verwende ich z.B. Zahlenwerte (z.B. if x<4 then), und da ist noch nie eine Fehlermeldung gekommen.

Noch seltsamer wird es mit folgendem Quelltext:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm2.Timer1Timer(Sender: TObject);
begin
if Form2.Color:=true then
  begin
    Form2.Color:=clRed;
    BitBtn1.Font.Color:=clBlack;
    BitBtn2.Font.Color:=clBlack;
  end
else
  begin
    Form2.Color:=clBlack;
    BitBtn1.Font.Color:=clRed;
    BitBtn2.Font.Color:=clRed;
  end;  
end;


Wenn ich dann also in der 3. Zeile, wie Delphi es verlangt, einen BOOLEAN-Wert einsetze (was ja eigentlich völlig sinnlos ist), dann kommt die Fehlermeldung "Inkompatible Typen: 'TColor' und 'Boolean'"

D.h., erst sagt Delphi es muss BOOLEAN sein, und dann beschwert es sich, dass es BOOLEAN ist.
Oder kann ich etwa die Farbe des Formulars nicht als Bedingung nehmen???

Ich hoffe dass ihr mir helfen könnt!


Gausi - Mi 18.03.09 15:46

Nicht so

Delphi-Quelltext
1:
if Form2.Color := clBlack then                    

sondern so

Delphi-Quelltext
1:
if Form2.Color = clBlack then                    


Andreas L. - Mi 18.03.09 15:53

Zitat:
Und ich hab noch nie gehört, dass eine simple if-then-Verzweigung unbedingt einen BOOLEAN-Wert in der Bedingung benötigt. Bei anderen Programmen verwende ich z.B. Zahlenwerte (z.B. if x<4 then), und da ist noch nie eine Fehlermeldung gekommen.


Was denkst du was das Ergebnis einer der folgenden Abfragen ist?


Delphi-Quelltext
1:
2:
3:
4:
5:
if Color = clBlack then
...
if Str = 'Test' then
...
if Int = 22 then


Sofern die verwendeten Variablen den abgefragten Wert enthalten, erhältst du als Auswertung wahr (True) also einen Boolean. Deshalb kann man auch sowas machen:

Delphi-Quelltext
1:
Button1.Enabled := ListBox1.Items.Count > 0;  //Der Button wird nur aktiviert wenn die Listbox min. einen Eintrag enthält                    


ffgorcky - Mi 18.03.09 22:29

Es ist doch ganz einfach zu erklären:
Die Abfrage, ob etwas gleich ist, ist nur mit dem Gleichheitszeichen zu versehen, während die Duppelpunkt-Gleich-Folge immer eine Zuweisung des rechten Wertes für/auf den linken ist!

also
if Label2.Caption='Hallo' then
wäre eine Abfrage, ob dieses denn so ist, während
Label2.Caption:='Hallo'
diesen Wert dort einträgt.
Reicht das so als Hilfe?

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt


Headcracker - Do 19.03.09 10:18

Uups! So ein dummer fehler von mir ... dabei ist doch klar, dass der Doppelpunkt da nicht hingehört ... war anscheinend zu offensichtlich, als dass ich den fehler bemerkt hätte^^