Eigenschaft: Enabled (TLabel)

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:

Windows 10 normal Farbmodus.
Windows 10 normal Farbmodus.

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

Windows 10 "hoher Kontrast 1" Farbmodus.
Windows 10 „hoher Kontrast 1“ Farbmodus.

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.

Fenster mit ein und ausgeschaltetem Label.
Label1.Enabled:=True Label2.Enabled:=False

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.

Edit1 hat den Focus. Lazarus
Edit1 hat den Focus. Highlting des Edit1-Textes und der IBeam-Cursor zeigen dies an.

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.