Ich möchte nochmal darauf hinweisen, dass das Abfangen der Tasteneingaben keineswegs die Lösung ist, per Kontext-Menü -> Einfügen geht es schließlich auch und das dann zu verbieten ist wohl eher eine Notlösung als anwenderfreundlich.
Meine Alternative wäre eine Funktion, die einen String auf "Zahlen" prüft und nur diese zurückliefert.
Delphi-Quellcode:
function StripDigits(sInput: String): String;
var
i, dFirstPos: Integer;
boolPrevWasDigit: Boolean;
begin
// Variablen initialisieren
Result := '';
boolPrevWasDigit := false;
dFirstPos := 1;
// Schleife in der alle Zeichen von sInput nach 0..9 geprüft werden
for i := 1 to Length(sInput) do
begin
// ist das i-te Zeichen aus 0..9?
if sInput[i] in ['0'..'9'] then
begin
// war das vorherige Zeichen keine Zahl?
if not boolPrevWasDigit then
// es war keine Zahl, aber dieses Zeichen ist eine Zahl,
// also setze Anfangsposition für erste gefundene Zahl nach
// einem Nicht-Zahl-Zeichen
dFirstPos := i;
// setze "vorherige Zeichen war eine Zahl" auf wahr
boolPrevWasDigit := true;
end // if sInput[i] in ['0'..'9'] then
else
begin
// war das vorherige Zeichen eine Zahl
if boolPrevWasDigit then
// es war eine Zahl, aber diese Zeichen ist keine Zahl,
// also kopiere die Zeichen von "Anfangsposition für die
// erste gefundene Zahl" (i - Anfangsposition) Anzahl Zeichen
Result := Result + Copy(sInput, dFirstPos, i - dFirstPos);
// setze "vorheriges Zeichen war eine Zahl" auf falsch
boolPrevWasDigit := false;
end; // else.. (if sInput[i] in ['0'..'9'] then)
end;
// da der Fall "vorheriges Zeichen war keine Zahl" am Ende der Zeichenkette
// nicht auftritt, wenn das letzte Zeichen eine Zahl ist:
// Prüfe ob das vorherige Zeichen eine Zahl war
if boolPrevWasDigit then
// wenn das vorherige (letzte) Zeichen eine Zahl war, dann kopiere die Zeichen von
// "Anfangsposition für die erste gefundene Zahl" (i - Anfangsposition) Anzahl Zeichen
Result := Result + Copy(sInput, dFirstPos, Length(sInput) + 1 - dFirstPos);
end;