UTF8Key in []

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

UTF8Key in []

Beitrag von Vbxler »

In einem alten Projekt habe ich Eingaben in ein TEdit über xyzKeyPress(Sender: TObject; var Key: char) ausgewertet. Das hat bestens funktioniert. Die Auswertung habe ich so gemacht:

Code: Alles auswählen

  if Key = #13 then
    cmdAnmeldenClick(self)
  else if not (Key in [#8, ' ', '_', 'a'..'z', 'A'..'Z', '0'..'9']) then
     begin
       Key := #0;
     end;  
Nach einer Änderung habe ich gesehen, dass Umlaute über 'Key: char' nicht mehr rein kommen.
Daher will ich jetzt xyzUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char) verwenden.

Frage:
Warum kann ich UTF8Key nicht mit dem Mengenoperatoren IN auswerten? 'UTF8Key in []'
Der Compiler liefert die Meldung: Error: Operator is not overloaded

Code: Alles auswählen

  if UTF8Key = #13 then
    txtPasswort.SetFocus
  else if not (UTF8Key in [#8, ' ', '_', 'a'..'z', 'A'..'Z', '0'..'9']) then
    begin
      UTF8Key := #0;
    end;  
Danke
Vbxler
-------------------------

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: UTF8Key in []

Beitrag von Mathias »

Warum kann ich UTF8Key nicht mit dem Mengenoperatoren IN auswerten?
Weil in der in-Anweisung nur ein Byte oder Char (8-Bit-Wert) erlaubt ist.

Aber TUTF8Char ist ein String.

Code: Alles auswählen

type TUTF8Char = String[7];
Bei dem Beispiel siehst du es gut, bei der 2. Zeile wird gemotzt.

Code: Alles auswählen

  if 'a' in [#1..#255] then ShowMessage('Hallo');
  if 'ä' in [#1..#255] then ShowMessage('Hallo');
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: UTF8Key in []

Beitrag von Vbxler »

Danke für die Information, habe ich nicht gewusst.

Seit wann ist das eigentlich so, dass ich bei KeyPress kein char für Umlaute kommt?
Kann man das eventuell wo umstellen, damit ich bestehendem Projekt nichts umbauen muss?

Danke
Vbxler
-------------------------

Benutzeravatar
theo
Beiträge: 10874
Registriert: Mo 11. Sep 2006, 19:01

Re: UTF8Key in []

Beitrag von theo »

Es gibt verschiedene Möglichkeiten.

Du kannst z.B. case verwenden:

Code: Alles auswählen

 
  case UTF8Key of
  'ä','ö','ü': Caption:='Umlaut';
  'a'..'z', 'A'..'Z':Caption:='Ascii';
  end; 

Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: UTF8Key in []

Beitrag von Vbxler »

Danke, so ähnlich habe ich es jetzt gelöst.
Eigenartigerweise funktioniert 'a'..'z', 'A'..'Z', '0'..'9' hier nicht.
Habe es so gemacht, das geht:

Code: Alles auswählen

 
  case UTF8Key of
  #13:
    cmdAnmeldenClick(self);
  'ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', #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;   
Vbxler
-------------------------

Benutzeravatar
theo
Beiträge: 10874
Registriert: Mo 11. Sep 2006, 19:01

Re: UTF8Key in []

Beitrag von theo »

Vbxler hat geschrieben: Eigenartigerweise funktioniert 'a'..'z', 'A'..'Z', '0'..'9' hier nicht.
Bei mir funktioniert der obige Code so wie er da steht. FPC 3.1.1
Wahrsch. geht es auch mit 3.0.0.
Mit 2.6.4 weiß ich es nicht.

Benutzeravatar
theo
Beiträge: 10874
Registriert: Mo 11. Sep 2006, 19:01

Re: UTF8Key in []

Beitrag von theo »

Und als Ergänzung noch dies: In der Unicode Welt sollte man eigentlich etwas anders an die Sache herangehen.
Folgendes Beispiel sagt dir, ob du einen Buchstaben, eine Zahl oder sonst etwas gedrückt hast.
Und das funktioniert auch für Zeichen, die du noch gar nicht kennst. :wink:

Code: Alles auswählen

uses character, LazUTF8;     
 
procedure TForm1.Edit1UTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
var
  Res: string;
  Cat: TUnicodeCategory;
begin
  Cat := GetUnicodeCategory(UTF8ToUTF16(UTF8Key), 1);
  case Cat of
    TUnicodeCategory.ucUppercaseLetter,
    TUnicodeCategory.ucLowercaseLetter,
    TUnicodeCategory.ucTitlecaseLetter,
    TUnicodeCategory.ucModifierLetter,
    TUnicodeCategory.ucOtherLetter: Res := 'Buchstabe';
    TUnicodeCategory.ucDecimalNumber,
    TUnicodeCategory.ucLetterNumber,
    TUnicodeCategory.ucOtherNumber: Res := 'Zahl';
    else
      Res := 'Andere Kategorie (siehe character.pas > TUnicodeCategory';
  end;
  Caption := Res;
end;   

Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: UTF8Key in []

Beitrag von Vbxler »

Sehr interessant!

Bis jetzt habe ich das Thema eigentlich eher verdrängt,
aber beim nächsten Projekt werde ich das gleich berücksichtigen.
Der Prgrammieraufwandt wird aber auch immer größer.

Vielen Dank!
Vbxler
-------------------------

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: UTF8Key in []

Beitrag von Mathias »

Für was ist diese Umwandlung: UTF8ToUTF16(UTF8Key) ?
Ich dachte fpc läuft mit UTF8.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10874
Registriert: Mo 11. Sep 2006, 19:01

Re: UTF8Key in []

Beitrag von theo »

Mathias hat geschrieben:Für was ist diese Umwandlung: UTF8ToUTF16(UTF8Key) ?
Ich dachte fpc läuft mit UTF8.
Ja, läuft wohl mittlerweile auch ohne explizite Umwandlung. Ich weiss aber nicht ab welcher Version. Vbxler hat wohl nicht die Neuste.

Antworten