Setzen Sie den Fokus wieder auf Bearbeiten, wenn die Registerkarte auf Delphi xe2
Habe ich 7 Bearbeitungen, wo der Nutzer das setzen von zahlen,die zahlen müssen zwischen 1100 und 1500. Am Anfang, in der ersten Bearbeitung ausgerichtet ist, und die den Benutzer, geben Sie seine Nummer, und er dann tab, um den Fokus auf das nächste Bearbeiten...
Mein Programm überprüfen muss, dass die Zahl entred durch den Benutzer, und wenn es nicht die Bedingung erfüllen (1100
Ich habe versucht, diesen code auf der Edit1Change, aber es funktioniert nicht
If (1500 < (strtofloat(edit1.text)) or (strtofloat(edit1.text) <1100) then
begin
Showmessage ('my message');
edit1.setfocus
end;
Update
Entschuldigt mich, Jungs, meine Beschreibung des Problems war nicht sehr klar, und mein Englisch ist nicht sehr gut.
Ich habe keine problem mit dem Vergleich oder die Prüfung des Zustands, mein problem ist, dass wenn ich die Option weiter Bearbeiten, indem Sie TAB drücken, auch wenn der Zustand war nicht zufrieden, meine Nachricht erscheint Edit1.Text
wird auf 0 zurückgesetzt, und der cursor springt zum nächsten Steuerelement zu Bearbeiten. Was ich möchte ist, dass, wenn der Benutzer Tab drückt und die Anzahl entred nicht die Bedingung erfüllen, erscheint die Meldung, Edit1.Text
dauert 0 und der cursor bleibt auf Edit1.
Versuchte ich Stelle die überprüfung der Bedingung und der Anweisung, um den Fokus auf die gleichen Bearbeiten, in Edit1.OnExit
aber es wird nicht so gut funktionieren, immer, wenn der Benutzer Tab drückt nach der Eingabe einer Zahl, die nicht die Bedingung erfüllen, erscheint die Meldung, die die erste Bearbeitung dauert 0, und der cursor bewegt sich zum nächsten Bearbeiten.
- 1) was meinst du mit "funktioniert nicht" ? 2) Sie können jedes fertige Komponente zur Eingabe von zahlen, dass bereits Prüfungen für min-und max-3) Sie können ready-made-Bibliothek, überprüft die Eingabe und markieren Sie falsche Einträge
- Konnte nicht mehr Zustimmen. Weshalb setzen Sie auf TEdits, wenn es TSpinEdits und wie? Auch die
OnChange
Ereignis ist nicht geeignet, weil es nicht ausgelöst, wenn der Benutzer verlässt den edit-Komponente durch Mausklick oder die Tabulatortaste. - dort ist auch problem mit der allein mit OnExit: es funktioniert nicht, wenn das Dialogfeld wird geschlossen, indem Sie die EINGABETASTE oder ESC-Taste - wenn der Fokus nicht actally bestanden aber weiter, nur die form ist geschlossen. Oder wenn TPageControl Registerkarten umgeschaltet wird, oder vielleicht Dialogfeld geschlossen, durch klicken auf TSpeedButton oder TMenuItem - das Ereignis kann nicht setzen Sie den Fokus Rücken, da TEdit.Ein Elternteil ist bereits unsichtbar. Also sollte man besser sich auf einige form-Breite validation framework
- Meine Antwort how to catch a
tab
- Taste gedrückt. Veranstaltung für Reiter - Danke , Der link für die Veranstaltung für Reiter mir so sehr geholfen hat, war die Lösung legen Sie die Prüfung für die Bedingung und die Anweisungen (edit1.setfocus), auf die Taste up der nächsten Bearbeitung 😉
- Kann ich nicht reproduzieren. Edit1.Text zurückgesetzt auf 0: dann ist wegen anderer code. Wir müssen sehen, áll-code, weil du etwas tust, das du noch nicht erzählt.
- Froh, dass meine Antwort dir helfen konnte.
KeyUp Event of the following TEdit
. Zu zeigen, dass andere Leser, Sie haben es, sollten Sie akzeptieren eine Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl Sie nicht angeben, was genau funktioniert nicht, hiermit einige Antworten, warum das nicht funktioniert, weil es ist ziemlich offensichtlich, was Sie wollen. Typische Anwendung ist die Eingabe eines Registrierungsschlüssels.
Verwenden Sie
StrToFloat
zu konvertieren, das Bearbeiten von text in einen numerischen Wert. Da möchte man den Wert zwischen 1100 und 1500, sollten SieStrToInt
, obwohl das nicht notwendig. Allerdings gibt es ein problem mit der Verwendung dieser Funktion, da dieText
- Eigenschaft ein leeres Bearbeiten ist''
, die nicht in eine Zahl umgewandelt werden und bewirkt, dass eineEConvertError
Ausnahme, die können leicht vermieden werden. VerwendenTryStrToInt
oderStrToIntDef
um diesen Fehler zu vermeiden.Ihren bedingten Ausdruck ist irreführend. Statt
verwenden
ist viel mehr lesbar. Sie können auch die
InRange
Funktion aus derSystem.Math
Einheit:was auch immer Sie bevorzugen.
Prüfen Sie diese Bedingung auf jeden Tastendruck in die Bearbeiten, weil
OnChange
feuert auf jede einzelne Bearbeitung. Wenn Sie nun beginnen Sie mit der Eingabe einer korrekten Zahl durch Eingabe 1, die Bedingung wird "true" ausgewertet wird, (die Meldung popup (aber ich verstehe, dass ist eine temporär-debugging-Funktion)), und der Schnitt gesetzt werden fokussiert. Aber es ist schon war, also das ist unnötig.Wenn Sie wählen Sie den nächsten Edit-Steuerelement durch drücken von TAB, die
OnChange
- Ereignis wird nicht ausgelöst, weil sich nichts geändert hat außer dem Fokus verlieren. Die Lösung ist, zu überprüfen, die Bedingung in derOnExit
Veranstaltung. Dies ist die Lösung für die Vorherige Bemerkung als gut.Einen Nachteil, der sich auf die Validierung in
OnExit
ist, dass das Ereignis möglicherweise nicht in Feuer im Fall von dialog-Verschluss. Aber das könnte oder würde nicht ein problem sein, da verlassen den dialog mit ESC oder das Dialogfeld schließen-Schaltfläche, in der Regel bedeutet, dass Sie das Abbrechen der operation. Aber denken Sie daran.Bonus
Hiermit eine intuitive Umsetzung, die lösen verschiedenen Anliegen. Link all diese event-Handler, um alle Edit-controls:
Könnten Sie auch einstellen, die
NumbersOnly
- Eigenschaft auf True, die bewirkt, dass ein Windows-Warnung für die Sprechblase, wenn jemand versucht, geben Sie eine alphabetische Zeichen.Reflexion
Validierung für jeden Schnitt seperat in
OnExit
wird Probleme für den Benutzer. Wenn der Benutzer es wünscht oder desides, um die operation Abbrechen, aus welchem Grund auch immer, er ist nicht in der Lage, weil die Abbrechen-Schaltfläche kann nicht erreicht werden, bis er in eine gültige Zahl. Eine andere situation Beispiel wäre die Eingabe von zweiten Wert teilweise, und wollen zurück zu den früheren für die Korrektur.Nicht belästigen Nutzer mit solchen Unannehmlichkeiten. Stattdessen überprüfen Sie alle Werte danach. Intermediate Ungültigkeitserklärung könnte visuell signalisiert durch die Verwendung von Farben, Sterne, Ausrufezeichen, Symbole, etc...
Navigationstasten (Tab, BackTab, die Pfeil-Tasten, und so weiter) sind nicht betroffen durch die KeyPreview-weil Sie nicht generieren Tastatur-Ereignisse.
Der einzige Ort, der die Punkte dieser Tatsache. Delphi-Hilfe TCustomForm.KeyPreview
Das einzige Ereignis, das Sie verwenden können, ist die KeyUp Ereignis des folgenden oder vorherigen TEdit.
Schauen Sie hier für ein Beispiel : die Antwort auf Abfangen der TAB-Taste im KeyPress-Ereignis
Wird abgefangen durch
OnExit
Veranstaltung http://docwiki.embarcadero.com/Libraries/XE2/en/Vcl.Controls.TWinControl.OnExitWas meinst du mit "funktioniert nicht" ?
Es funktioniert tatsächlich - es ständig setzt den Fokus auf die Bearbeiten Sie text keying in.
Aber das ist schlechte Zeit, um änderungen zu prüfen: wenn der Benutzer "1100" bis "1500" Benutzer wahrscheinlich haben Zwischenergebnis "100" oder "15100", in denen Ihre Anwendung Abstürzen würde, seine Arbeit durch modale Dialoge.
Sollten Sie entweder vermeiden, überprüfen während der Bearbeitung und prüfen nur nach dem Bearbeiten gemacht. Oder sollten Sie-Anzeige Ergebnis der Prüfung in einem nicht-stören-Achsen nicht modal (Art und Weise, sodass der Benutzer weiter Bearbeiten. Wie das ändern von TEdit hintergrund zwischen rot und grün oder wie mit einige Prüfungen Bibliothek hinzufügen Fehler-Markierungen.
Oder benutzen Sie einfach die numerischen editor mit denen min, max und prüft, built-in
Es ist eine alte Frage, aber ich kann nicht sehen, die richtige Antwort:
Nie manipulieren, konzentrieren sich inzwischen der Fokus verändert sich.
In OnExit windows gestartet, um den Fokus verschieben, aber leider noch nicht fertig.
Wenn Sie möchten, unterbrechen Sie den Fokus ändern, weil der Validierung, verwenden Sie "Abort;"
Stellen Sie außerdem sicher, dass Sie nicht die Manipulation des Fokus in der OnClose-Ereignis
denn es wird schließlich zum Auslöser einer unerwünschten OnExit des aktiven Steuerelements.