Verweis: | Visible Color TabStop |
Uses: | StdCtrls |
Eingabe: | Ein- oder Ausschalten mittels true oder false:Boolean. |
Ausgabe: | Eine aktive oder „ausgegraute“ Komponente. |
Funktion: | Aktiviert oder deaktiviert die Maus- und die Tastaturereignisse. |
Enabled heißt eingeschaltet und da gibt es entweder den Zustand „An“ (True) oder „Aus“ False. Bei „an“ ist das Label schwarz bei „aus“ ist es grau. Bei „an“ reagiert das Label auf Maus- und Tastatureingaben und bei „aus“ reagiert es nicht darauf. So wird die Funktion „Enabled“ in vielen Büchern beschrieben. Grob gesehen stimmt das auch. Jedoch möchte ich das hier nicht so stehen lassen.
Die Farbe
Die Farbe des Labels ist abhängig von den Einstellungen im Betriebssystem. Diese muss bei „an“ nicht zwangsläufig Schwarz sein und bei „aus“ auch nicht zwangsläufig Grau. Vielmehr ist es bei „an“ die unter Font vorgegebene Farbe oder die Systemfarbe clWindowText. Bei Enabled:=False ist es immer clGrayText. Dies kann bei Windows 10 so aussehen:

Oder wenn man bei den Farbeinstellungen „hohen Kontrast 1“ gewählt hat, so aussehen.

Im zweiten Bild ist clGrayText grün. 🙂 Die Bezeichnung clGrayText kommt von ausgrauen deswegen „grey“. Warum das immer clGrayText ist erklärt das Beispiel 1.
Beispiel 1
Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie zwei TLabel und einen TButton auf die Form. Erstellen Sie ein Onklick-Ereignis bei Button1.
procedure TForm1.Button1Click(Sender: TObject);
var
FarbText: string;
begin
// Stelle die Schrift-Farbe auf rot.
Label1.Font.Color := ClRed;
Label2.Font.Color := ClRed;
// Deaktiviere Label2
Label2.Enabled := False;
// speicher die Farbe als Hex-String in
// in FarbText
FarbText := IntToHex(ColorToRGB(Label2.Font.Color));
// Zeide jedes 2.Mal (ungerade) das Info-Fenster
if Odd(Tag) then ShowMessage('Label2 hat immer noch die Hexfarbe:$' + FarbText);
// Erhöhe Tag um 1
Tag := Tag + 1;
end;
Wie sie dem Quelltext entnehmen können, haben wir bei beiden Labeln die Schrift-Farbe auf rot gestellt. Es blieb aber lediglich die rote Farbe des Label1 erhalten. Das Label1 haben wir nicht deaktiviert.

Es ist jedoch das Label2 durch die Eigenschaft auf die Systemfarbe clGrayText (im Bild tatsächlich grau) geschaltet worden. Dennoch ist die Font-Farbe von Label2 weiterhin clRed was dem hexadezimalen Wert von $000000FF entspricht. Das Meldungsfenster wir übrigens nur bei jedem 2. Klick auf den Button1 angezeigt. Jetzt wissen Sie was ich mit „immer Angezeigt“, weiter oben im Text, meinte.
Im 2.Beispiel geht es um die Reaktion bei Maus und Tastatur-Ereignissen. Wenn Sie nicht wissen, dass ein Label auch auf Tastatur-Ereignisse reagieren kann, dann sollten Sie nun Eigenschaft: Caption (TLabel) lesen.
Beispiel 2
Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie ein TLabel, ein TEdit und einen TButton auf die Form. Erstellen Sie ein Onklick-Ereignis bei Button1, ein OnEnter-Ereignis bei Edit1 und ein Onklick-Ereignis bei Label1.
procedure TForm1.Button1Click(Sender: TObject);
begin
case tag of
0: begin
//Erster Aufruf gilt der Formatierung
Form1.Width := 400;
Form1.Height := 200;
Form1.BorderWidth := 20;
Label1.Align := alTop;
Label1.Enabled := False;
Edit1.Align := alTop;
Label1.FocusControl := Edit1;
Label1.ShowAccelChar := True;
Button1.Align := alBottom;
Button1.Caption := '-> Enabled:=True';
end;
1: begin
Edit1.Text := 'Edit1';
Edit1.Tag := 0;
Label1.Caption := 'Klick mich an.';
Label1.Enabled := True;
Button1.Caption := '-> Enabled:=False';
end;
2: begin
Label1.Caption := 'Jetzt bin ich inaktiv.';
Label1.Enabled := False;
Button1.Caption := '-> Visble:=False';
end;
3: begin
Label1.Caption := 'Jetzt bin ich unsichtbar.';
Label1.Visible := False;
Button1.Caption := '-> Visble+Enabled:=True';
end;
4: begin
Label1.Caption := 'Jetzt bin ich sichtbar und aktiv.';
Label1.Visible := True;
Label1.Enabled := True;
Button1.Caption := '-> Hotkey Aktion';
end;
5: begin
Label1.Caption := '&Tippe Alt+T';
Button1.Caption := '-> Enabled:=False';
end;
6: begin
if Edit1.Tag = 0 then
begin
ShowMessage('Es geht erst weiter, wenn Edit1 den Fokus hat.');
exit;
end;
Label1.Enabled := False;
Label1.Caption := '&Drücke Alt+D';
//Zum Testen nehmen Sie den Kommentar der folgenden Zeile raus.
//Label1.FocusControl:=nil;
Edit1.Text := 'Enabled:=False -> Kein Hotkey?';
Button1.Caption := '-> Von Vorn';
end;
end;//Case
Tag := Tag + 1;
if Tag = 7 then Tag := 1;
end;
procedure TForm1.Edit1Enter(Sender: TObject);
begin
ShowMessage('Hier Edit1. Ich habe den Fokus.');
Edit1.Tag := 1;
if Edit1.Text = 'Enabled:=False -> Kein Hotkey?' then
ShowMessage('Von Wegen! Trotzdem Aktiv !');
end;
procedure TForm1.Label1Click(Sender: TObject);
begin
ShowMessage('Label1 wurde angeklickt.');
end;
Da das Programm auf mehrere Durchgänge hat, werde ich hier den Quelltext bei jedem Klick auf den Button beschreiben.
Klick 1
Der erste Klick dient der Formatierung und der Grundeinstellung des Formulars und der Komponenten. Dies hätten Sie auch alles im Objektinspektor einstellen können. Label1 ist inaktiv.
Klick 2
Durch einen Klick auf den Button der mit -> den nächsten Schritt anzeigt, haben wir das Label eingeschaltet und mit der Schrift „Klick mich an.“ versehen. Wie Sie das machen erscheint ein Meldungsfenster welches uns die Gewissheit gibt das dies nun eine OnKlick-Ereignis ausgelöst hat.
Klick 3
Da wir den Button mit der Aufschrift „Enabled:=false“ angeklickt haben ist genau dies eingetreten. Das Label ist ausgegraut und weist uns auf seine Inaktivität hin. Wenn wir das Label nun mit der Maus anklicken, passiert nichts. Also kein Onklick-Ereignis.
Klick 4
Dieser Durchgang hat nichts mit Enabled zu tun. Es soll lediglich den Unterschied zwischen Enabled und Visible erklären. Während Enabled:=False das Label inaktiv schaltet macht der Befehl Visible :=False das Label unsichtbar. Deswegen hätten wir uns auch die Beschriftung mit „Jetzt bin ich unsichtbar.“ sparen können.
Klick 5
Dieser Durchgang schaltet wie zuvor auf dem Button versprochen das Label wieder an und aktiviert es. Ein Klick mit der Maus auf das Label führt wieder zu unserem OnKlick-Ereignis.
Klick 6
Mit einem Label können Sie über die das &-Zeichen und den Einstellungen mit ShowAccelChar und FocusControl, einer fokusfähigen Komponente den Fokus geben. Hier ist diese Komponente Edit1. Wenn Edit1 den Fokus erhält, dann wird das Ereignis OnEnter bei der entsprechenden Komponente (hier Edit1) ausgelöst. Halten Sie also nun die Taste Alt gedrückt und tippen Sie zusätzlich die Taste T. Es erscheint die Meldung, das Edit1 den Focus hat. Wenn Sie nun noch ein weiteres mal die Tasten-Kombination Alt+T verwenden in der Hoffnung dass, das Meldungsfenster nochmal erscheint so muss ich Sie enttäuschen.

Den das Ereignis wird nur beim Erhalt des Fokuses ausgelöst. Wenn Sie in einem Raum sind, dann können Sie den selben Raum nicht betreten, da Sie ja bereits in dem Raum sind. 🙂 Wenn sie das Ereignis „Raum betreten“ wieder erzeugen wollen, dann müssen Sie den Raum zuvor verlassen haben. Wenn Sie die Tasten Kombination Alt + T überhaupt noch nicht benutzt haben, dann wird Sie das Programm solange auffordern dies zu tun, bis Sie sich dem Willen des Programmierers gebeugt haben. 🙂
Klick 7
Wenn Sie nun den Button “ -> Von Vorn“ Klicken, springen wir zum 2. Schritt den die Formatierung des Fensters können wir uns sparen. Wenn Sie allerdings die Tastenkombination Alt + D Tippen dann geschieht etwas ungewöhnliches. Label1 erzeugt bei Edit1 ein OnEnter-Ereignis obwohl dies eigentlich nicht geschehen sollte, da wir das Label1 inaktiv geschaltet haben. Sie können dieses unschöne Verhalten abstellen, in dem Sie den Zeiger der Zielkomponente mit dem Befehl:
Label1.FocusControl:=nil;
ins „Nichts“ stellen. Hierzu brauchen sie nur die beiden // aus der besagten Zeile im Quelltext zu löschen.
Erläuterungen zum Programmierstil
Mir ist bewusst, dass der Tag-Befehl einer Komponente wenig Aussagekraft hat. Bei größeren Programmen sollten Sie eine globale Variable mit Aussagekraft im Namen erstellen. Dies gilt auch für die Namen der Komponenten die ich in unseren Beispielen grundsätzlich auf „default“ stehen lasse. Die Abfrage eines Zustandes einer Komponente sollte Grundsätzlich nicht wie hier über den Text erfolgen. Die Befehlszeile:
if Edit1.Text = 'Enabled:=False -> Kein Hotkey?' then....
ist in diesem Falle suboptimal um nicht zu sagen dämlich. 🙂 Ich habe es hier trotzdem so gelassen, weil es in diesem Schulungsfall, die Abfrage aussagekräftiger erscheinen lässt.