Einzelnen Beitrag anzeigen

silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#9

AW: Überprüfen von Edit

  Alt 16. Feb 2012, 01:20
Ich kapiers einfach nicht kann ich nicht machen das nur zahlen eigeben kann anderes wir ignoriert bitte um erklärung mit Code.

Ich hätte dazu nur die idee OnKeyPress
Wenn Du die Idee schon hast... aber dann will ich mal nicht so sein

[edit] Arrgh, wieso hab' ich die zweite Hälfte des Posts von verwirrt übersehen? Da steht ja schon alles drin...[/edit]

Delphi-Quellcode:
procedure frmMain.edPortKeyPress(Sender: TObject; var Key: Char);
begin
 if not CharInSet(Key, [#8, #48..#57]) then
// if not (Key in [#8, #48..#57]) then //<-- auf älteren Systemen, in denen CharInSet noch nicht existiert *
   Key := #0;
end;
*“in” is dead, long live “CharInSet” (or maybe not)

Dieser Code verhindert, dass beim Tastendrücken andere tasten als Backspace und die Ziffern 1..0 "verwendet werden können".
Die Variable "key" enthält dabei den ASCII Code der Taste, die gedrückt wurde, und die eben an den Text, der schon im Edit-Feld steht, angehängt werden soll.
Wir sagen jetzt einfach: Wenn dieser ASCII Code nicht der von BACKSPACE (damit wir Fehleingaben wieder löschen können) oder der der Ziffern 1..0 ist, dann soll der Tastencode eben #0 (oder "nichts") sein.

Dieser Code alleine hat aber (mindestens) einen gravierenden Nachteil: Es ist immer noch möglich über Copy/Paste Buchstaben oder andere unerwünschte Zeichen in das Edit-Feld zu werfen.
Und dann knallt es, wenn man über StrToInt(edPort.Text) den Edit-Inhalt in eine Zahl umwandeln will.

Von daher ist der geheimnisumwitterte Vorschlag schon richtig, eine (zusätzliche) Überprüfung in das OnExit Event des Edits zu schreiben:

Delphi-Quellcode:
procedure frmMain.edPortExit(Sender: TObject);
var temp : Integer;
begin
  if not TryStrToInt(edPort.Text, temp) then
    (sender as TEdit).setFocus;
end;
Wenn also das edit-Feld verlassen wird (den Focus verlieren soll ???), dann wird geprüft, ob sich die Zahl ohne Probleme in einen Integer umwandeln lässt. Wenn das nicht der Fall ist, wenn also TryStrToInt False zurückgibt, wird der Focus wieder auf das EditFeld gesetzt.
Mit anderen Worten, solange kein "gültiger" Inhalt im edit-feld steht, kann dasselbe nicht verlassen werden.

Die Überprüfung im OnExit ist von daher schön, weil man im weiteren Verlauf des Programms praktisch sicher sein kann, dass nur "gültige" Daten (also nur Zahlen) im Edit stehen.
Unbedingt nötig ist keine der beiden Methoden, da man auch selbst im Code bei jeder Umwandlung über TryStrToInt oder StrToIntDef prüfen kann, aber etwas einfacher ist es schon

P.S. @Geheimniskrämer: Sowas, edit.NumbersOnly kannte ich noch nicht, wieder was gelernt. Danke dafür!

P.P.S. @MisterC: Sorry, aber das muss ich mal sagen: Ich habe Deinen Post dreimal lesen müssen, bis ich verstanden habe, was Du willst...
Tobias
Bitte nicht hauen , ich weiß es nicht besser

Geändert von silver-moon-2000 (16. Feb 2012 um 01:33 Uhr)
  Mit Zitat antworten Zitat