Michl hat geschrieben:Kannst du etwas mehr erklären, was du vorhast?
Naja, ich bastel an meinem Taschenrechner rum. Ich habe eine 'dumme' Form, die jegliche Eingaben an eine Rechnerklasse weiterreicht, wo dann diese Eingaben validiert und verarbeitet werden. Die Klasse stellt der Form dafür die Methode TRechner.EingabeAnfuegen(zeichen:char) zur Verfügung.
In einem ersten Schritt habe ich die Eingaben über Buttons auf der Form realisiert. Ihr wisst schon: Nummernfeld und Tasten für die Operatoren usw. Das funktioniert auch prima über das OnClick-Ereignis. Der Button meldet sich bei einer zentralen Prozedur, die seine Caption (da ist ja die Zahl /der Operator drauf) als Char-Argument an mein Rechnerobjekt übergibt.
Aber man will ja einen Rechner nicht nur über Mausgeschubse bedienen, sondern häufiger wird man seine Eingaben in die Tastatur tippen. Also habe ich versucht, Tastaturevents abzufangen. Meine Form filtert die raus (KeyPreview steht auf True) und soll sie natürlich auch an die o.g. Klassenmethode weiterreichen. Ich brauche also als Parameter ein Char. Die Form reicht alles an Keys weiter, was ihr eingegeben wird, sie kümmert sich nicht darum, ob die in einer Rechenformel Sinn machen. Das ist der Job des Rechner-Objektes.
Zuerst habe ich es über das KeyDown-Ereignis der Form versucht. Da bekomme ich den Key als Word übergeben. Ich habe versucht, das via Chr(Key) weiter zu reichen, aber das klappt nicht. Die Zahlen 0-9 auf der normalen Tastatur werden korrekt erkannt, aber bei Komma, Operatoren und Tasten des Nummernblocks kommen bei Chr(Key) die falschen ASCII-Codes raus (Komma zB Code 188).
Deswegen bin ich auf diese UTF8KeyPress-Geschichte gekommen. Da werden alle Zeichen, die ich für meinen Rechner brauche, korrekt über den UTF8Key erkannt und übergeben. Ich hatte nur das Problem, dass ich keinen direkten Konverter von UTF8Key nach Char gefunden habe und deswegen auf Theos Lösung aus dem anderen Thread gestoßen bin. Bei mir funktioniert er bisher tadellos. Mal sehen, was passiert, wenn ich noch Backspace und Enter einbinden (Enter auf dem Nummernblock erzeugt bei mir eine '1'). Aber soweit war ich noch nicht. Wenn jemand eine bessere Lösung weiß, ich bin zu jeder Schandtat bereit

Wer nachsehen will, der Code ist angehangen (der ist aber noch nicht vollständig).
Ich mag Pascal...