KeyPress und Umlaute

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
hebeyer
Beiträge: 6
Registriert: Di 4. Feb 2020, 18:58
OS, Lazarus, FPC: Lazarus 3.8 mit FPC 3.2.2 auf Windows 11

KeyPress und Umlaute

Beitrag von hebeyer »

Hallo,
ich möchte in einem Editfeld nur bestimmte Tasten für die Tastatureingabe freigeben.
Dazu verwende ich in Edit1KeyPress folgende Prozedur:

Code: Alles auswählen

 
 if not (Key in ['a'..'z', 'A'..'Z', '0'..'9', '-', '_', ' ', #8, '(', ')', ',', '.', '$', '%', '&', '!', ';']) then Key := #0;
  
Dies funktioniert auch sehr gut, jedoch habe ich folgendes Problem:
Wenn ich in diese Zeile die Umlaute hinzufüge - z. B. ,'ä' meckert der Compiler mit der Meldung "Error: Ordinal expression expected".

Ich habe nun schon etwa 2 Stunden nach Lösungen gesucht, jedoch nichts gefunden, was auch funktioniert hätte.
Hat von euch vielleicht jemand den entscheidenden Tipp für mich?
Ich verwende Lazarus 3.8/FPC 3.2.2 auf Windows 11.

Viele Grüße
Henning

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

Re: KeyPress und Umlaute

Beitrag von theo »

Willkommen bei Unicode!

Nimm das Event OnUTF8KeyPress.
Für die ASCII Zeichen kannst du es machen wie gewohnt.
Für Zeichen die aus mehreren Byte bestehen, z.B. mit case:

Code: Alles auswählen

procedure TForm1.Edit1UTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
var Ignore:Boolean;
begin
  Ignore:=False;
  if not (UTF8Key[1] in ['a'..'z', 'A'..'Z', '0'..'9', '-', '_', ' ', #8, '(', ')', ',', '.', '$', '%', '&', '!', ';']) then Ignore:=true;
  case UTF8Key of
   'ä','ö','ü' : Ignore:=false;
  end;
  if Ignore then UTF8Key := #0
end;  
Nur kurz runtergehackt, das müsstest du noch testen und anpassen.

Benutzeravatar
greye
Beiträge: 45
Registriert: So 16. Feb 2014, 15:38
OS, Lazarus, FPC: Debian/Fedora/Windows, Lazarus 3.6/4.0RC2, FPC 3.2.2
CPU-Target: 64 Bit

Re: KeyPress und Umlaute

Beitrag von greye »

Keine Ahnung, aber irgendwie fühlt sich das so an, als könnte es vielleicht helfen:

https://forum.lazarus.freepascal.org/in ... ic=33641.0

Vor allem
You can't use ordinal value greater than 255 in sets. '€' is off limits because it is in unicode range (its ordinal value is greater than 255).
Allerdings auch
That's partially correct. Sets are limited to 256 values, but the euro sign can also depend on the ANSI codepage. If it is supported it is 128 (alt-0128) and as such within range for a western european codepage and not in the higher unicode range. Of course for UTF8 you are correct.
Also wie gesagt, keine Ahnung, aber wenn Du es schaffst, daß die richtige Codepage/ANSI verwendet wird, sollte das gehen, denn die German Ümläuts sind da im Bereich bs 255 enthalten: http://unicode.e-workers.de/ansi.php

42m

hebeyer
Beiträge: 6
Registriert: Di 4. Feb 2020, 18:58
OS, Lazarus, FPC: Lazarus 3.8 mit FPC 3.2.2 auf Windows 11

Re: KeyPress und Umlaute

Beitrag von hebeyer »

@theo: Vielen lieben Dank! Dein Code funktioniert einwandfrei. Aber selbst wäre ich da nie drauf gekommen. Bin ja nur ein Hobbyprogrammierer :D
@greye: Auch dir vielen Dank für deine Mühe. Den von dir verlinkten Forenbeitrag hatte ich auch schon gefunden. Er hat mich jedoch leider nicht weitergebracht.

VG
Henning

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

Re: KeyPress und Umlaute

Beitrag von theo »

@greye: Bitte nicht zur Verwirrung beitragen.
Lazarus arbeitet mit UTF-8, Ansi (256) hilft da nicht.

Benutzeravatar
greye
Beiträge: 45
Registriert: So 16. Feb 2014, 15:38
OS, Lazarus, FPC: Debian/Fedora/Windows, Lazarus 3.6/4.0RC2, FPC 3.2.2
CPU-Target: 64 Bit

Re: KeyPress und Umlaute

Beitrag von greye »

theo hat geschrieben: So 9. Feb 2025, 16:51 @greye: Bitte nicht zur Verwirrung beitragen.
Lazarus arbeitet mit UTF-8, Ansi (256) hilft da nicht.
Ah, ok. Verwirren wollte ich nicht. Und wie gesagt, ich habe keine Ahnung, ich habe mich nur daran erinnert, daß diverse Datumsformate mal böse bei mir reingegrätscht haben und ich das mit einer Konvertierung beheben konnte. Irgendwie habe ich da im Rahmen der Internationalisierung einfach angenommen, daß das mit Zeichen(sätzen) auch geht. Und irgendwie scheint man das Problem auch gelöst zu haben, wenn ich das richtig verstehe dadurch, daß nicht Char sondern String verwendet wird.

Aber wie gesagt, keine Ahnung. Und ja, dann sollte ich still sein, ich weiß. Wie geschrieben, verwirren wollte ich nicht. Tut mir leid.

Antworten