OnUTF8KeyPress

Verweis: Tutorial-Key Ereignisse
Uses: Classes
Eingabe: Nichts
Ausgabe: String[7]
Funktion: Wertet ein OnkeyPress ereignis mit mehr als einem Byte aus.

Normalerweise gehört diese Beschreibung eher nach: “Tutorial-Key Ereignisse” da dies jedoch recht spät und sehr weit unten auf der Seite stehen würde und dies eigentlich kein typisches OnKey-Ereignis ist, haben wir uns für diese Seite entschieden. Wenn Sie mit dem Ereignis OnKeypress ein Umlaute auswerten wollen, dann kann ich Ihnen sagen, dass dies nicht ohne einem Aufwand zu tätigen ist. Dazu haben die Macher von Lazarus ein anderes Ereignis erstellt. Dieses Ereignis heißt “UTF8KeyPress”. Hier handelt es sich eigentlich um kein Keypress Ereignis, welches Sie bereits kennen. Hier wird statt eines Char ein String übergeben. Und weil das so ist, können Sie dieses Ereignis auch nicht wie ein Ordinalwert behandeln. Was heist das jetzt in der Praxis. Während sie ein Keypress-Ereignis zum Beispiel So behandeln können:

  if not (Key in ['0'..'9']) then
      key := #0;

Was dann so viel heißt wie : “Wie lasse kein Zahlen zu.” Hier können wir also Prima mit ‘0’..’9′ eine Menge definieren. Dies geht aber nur, wenn ich Werte habe die ein Byte nicht überschreiten. Wir Hätten auch folgendes Schreiben können: #48..#57. Und jetzt dürfte Ihnen doch der Zusammenhang klarer werden. Die Char definieren sich über eine Zahl und diese kann ich mit von .. bis angeben. Das können sie mit einem String nicht tun. Wenn ich hier jetzt schreiben würde ‘von’..’bis’ wie soll der PC dann noch wissen was zwischen ‘von’….und…’bis’ liegt ?Auch wenn das schwierig zu verstehen ist. Es gibt Tasten auf Ihrer Tastatur diese werden als eine 2 – Byte Zeichenkette interpretiert und das ist der Punkt an dem wir nicht mehr von einem Char sondern von einem String reden. So ist in dem Ereignis “UTF8KeyPress” nicht von einem normalen Char die Rede sondern von einem Typ der “TUTF8Char” heißt. Wenn Sie nun diesen Typ – Verfolgen indem Sie mit gedrückter Steuerungs-Taste auf den Eintrag “TUTF8Char” klicken, dann gelangen Sie zu dieser Quelltext- Zeile:

  TUTF8Char = String[7]; // UTF-8 character is at most 6 bytes plus a #0

Sie sehen also, das der vermeintliche Char, in Wirklichkeit ein String mit einer Zeichenlänge von 7 Zeichen. Und zwar 6 Bytes für die Aufnahme von Informationen und einem 0 Byte als Abschlusszeichen.
Damit ist bewiesen dass es sich bei dem Zeichen um eine Zeichenkette handelt die einen String darstellt. Dies hat Auswirkungen auf die Behandlung des Rückgabe-Wertes dieses Ereignisses.
Hierzu folgendes Beispiel:

Beispiel 1

Vorbereitung: Erstellen sie eine IDE Anwendung und ziehen Sie einen TEdit auf die Form. Doppelklicken sie auf den Button und ersetzen Sie das Ereignis durch folgenden Quelltext:

procedure TForm1.Edit1UTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
  begin
      case UTF8Key of
      #13, #8,
      'ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß', ' ', '-', ',', '.', '?', ';', ':',
      'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
      'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
      'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
      'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z':
        ;
      else
        UTF8Key := #0;
    end;
  end;

Die Auswertung des “UTF8Key” ist die Auswertung eines Strings und dies geht direkt am einfachsten über die “Caseanweisung”. Jetzt werden Sie einwenden dass, es sich hier auch nur um ein Einzelzeichen handelt. Also selbst wenn sie hier nur Werte auswerten die nur ein Zeichen haben und keine Umlaute enthalten ist es dennoch ein String. Ein String mit einem Byte ist ein String, weil er als String deklariert ist. Der String könnte ja auch leer sein. Das ist letztendlich irrelevant. In dem Beispiel werten wir ja auch unsere Umlaute aus. Diese Vorgehensweise ist zugegebenermaßen etwas Umständlicher als mit einem Aufzählungswert. Ein String ist kein Aufzählungswert, es sei denn ich packe ihn in ein Array und zähle das Array durch. Hier in dem Beispiel reagieren wir auf die Texteingabe damit, dass wir diese unverändert lassen. Deswegen befindet sich hinter dem “:” gleich das abschließende Semikolon. Sollten Zahlen oder andere nicht aufgeführte Zeichen, eingegeben werden dann reagieren wir mit einer #0 was das gleiche ist wie keine Taste getippt.