Benutzer mit den meisten Antworten
cursorzeiger auf eingabe setzen?

Frage
-
Hallo Comunity,
wie schaffe ich es, dass wenn ich eine Eingabe in ein Textfeld mache, der Zeiger eines Cursors direckt auf den gewünschten Datensatz springt. (wenn ich nämlich irgentwann eine 5-stellige IP habe, dann wird das mit SKIP und SKIP-1 auf dauer zu mühsam..
also wenn ich zum beispiel eine 2554 eingebe, dass der dann den datensatz mit der ip 2554 anzeigt, oder wenn ich in ein anderes tf Peter eingebe, dass der dann zum ersten datensatz spring, wo das Feld "Name" = "Peter" ist..- Bearbeitet Schosch93 Montag, 5. November 2012 15:17
Montag, 5. November 2012 15:15
Antworten
-
>Sobald ich eine ziffer eingebe verlirt das textfeld sofort den Fokus.
Wie ist denn die Textbox eingestellt? Hast Du da eine Inputmask gesetzt, hast Du MaxLength gesetzt?
Wenn nicht, dann lassen sich unbeschränkt lange Zahlen oder Text eintippen, die Textbox setzt den Fokus von alleine nicht weg, nur weil Du ein Zeichen eintippst.
Vieleicht hast Du in irgendein Refresh() Event einprogrammiert, daß der Fokus irgendwohin gesetzt wird, was man im Refresh nicht tun sollte.
Und probiere das VALID() Event aus, das kommt sowieso nur einmal, wenn man RETURN oder TAB tippt oder mit der Maus woanders hin klickt. Das KeyPress oder InteractiveChange brauchst Du nur dann, wenn Du interaktiv zu jedem getippten einzelnen Buchstaben eines Namens schon zum ersten Datensatz springen willst, der auch so beginnt. Wenn das gar nicht Deine Idee ist, dann ist es übertrieben, die Suche dort zu machen.
Im VALID hast Du keine Angabe über den Tastencode, es kann Dir aber egal sein, warum der Fokus jetzt im Begriff ist, die Textbox zu verlassen. Die Eingabe ist in jedem Fall dann beendet und die Suche kann den aktuellen Value suchen.
Tschüß, Olaf.
- Bearbeitet Olaf Doschke Mittwoch, 7. November 2012 13:47
- Als Antwort markiert Schosch93 Mittwoch, 7. November 2012 15:47
Mittwoch, 7. November 2012 13:45
Alle Antworten
-
IPs gibt's im Netzwerk, Du meinst ID, aber egal. Siehe GOTO, RECNO() und RECCOUNT(), aber auch LOCATE und SEEK.
GOTO 2554 geht zu Datensatznummer 2554, was nicht unbedingt ID 2554 sein muss, wenn mal Datensätze gelöscht und per PACK wirklich vom DBF entfernt wurden.
RECNO() gibt die aktuelle Datensatznummer, RECCOUNT() die Anzahl Datensätze, auch recht hilfreich mit GOTO.
LOCATE läßt Dich z.B. "Peter" lokalisieren:
SELECT Users
LOCATE FOR name="Peter"IF FOUND()
Messagebox("Hallo Peter")
ELSE
Messagebox("Peter? Gibt's hier nich")
ENDIFSELECT Users
SET ORDER TO name && AChtung: ERst ein Index auf das Feld Name im Tabellendesigner anlegen, falls der Index noch nicht existiert
SEEK "Peter"IF FOUND()
Messagebox("Hallo Peter")
ELSE
Messagebox("Peter? Gibt's hier nich")
ENDIFTschüß, Olaf.
Montag, 5. November 2012 20:01 -
muss ich in der IF FOUND() anweisung sagen, dass der noch zu dem gefundenen Datensatzt springen muss, oder steht der Zeiger dann schon da dadrauf?? Und Wohin muss ich den code schreiben, damit ich nicht erst eine aktion durführen muss, sondern automatisch nach 1 sekunde warte zeit sucht?? Also ID eingeben, ne sekunde oder eventuell auch ne halbe sekunde warten und dann ist der auf dem gewünschten daten satz.. (zusätzlich wenn der mouse curser im ID textfeld ist beim betätigen der Enter taste sofort auf datensatz springen)
- Bearbeitet Schosch93 Dienstag, 6. November 2012 08:20
Dienstag, 6. November 2012 08:15 -
Les' doch mal in der Hilfe nach was LOCATE, SEEK und FOUND() sind und machen.
1. LOCATE bzw. SEEK positionieren schon auf den gesuchten Datensatz, FOUND() sagt aus, daß etwas gefunden wurde, es heißt nicht FIND() (finde) sondern FOUND() (gefunden).
2. von alleine passiert nichts, aber die Textbox hat Events: InteractiveChange() für jede einzelne interaktive Werttänderung z.B. getippte Ziffer (oder Buchstabe), KeyPress() ebenso, selbst für nicht sichtbare Tasten wie Pfeiltaste, und dann gibt es noch Valid(), was z.B. beim TAB oder auch RETURN angestoßen wird und mit dem Du dann noch validieren kannst, ob This.VALUE gültig ist und ob das verlassen der Textbox erlaubt sein soll, oder nicht. Wegen "nach 1 Sek." könntest Du ein Timer nehmen, aber wozu es sich kompliziert machen?
Tschüß, Olaf.
Dienstag, 6. November 2012 11:09 -
es so kompliziert machen?? wegen einem vorhersehbaren bug.. wenn ich die sekunde nicht abwarte (oder eventuell auch nur eine halbe, muss ich austesten) und z.b nach der ID 255743 suche es aber aufgrund von delete und pack die ID 255 fehlt, (256 und 257 aber da sind) kommt sofort eine fehlermeldung, und das will ich verhindern. Zumindest wenn ich das über interactiveChange mache..Dienstag, 6. November 2012 15:07
-
Bug?
GOTO auf eine nicht vorhandene Recordnummer gibt einen Fehler, aber den kann man abfangen:
TRY
GOTO ...
CATCH
Messagebox("Datensatz nicht gefunden")
ENDTRY
Außersem ist SEEK bzw. LOCATE mit FOUND() möglich, ohne TRY zu bemühen, da ist dann eben FOUND() False. Und wenn Du in dem Fall zum alten Datensatz willst, merke Dir vorher lnInitialRecno = RECNO() und springe zurück mit GOTO lnInitialRecno
Und wenn Du nicht bei jedem Tastendruck wegspringen willst, dann nimm doch das VALID() Event, das läuft nur durch RETURN bzw. klicken oder TABben in ein anderes Steuerelement.
Tschüß, Olaf.
Dienstag, 6. November 2012 17:06 -
Valid ist echt komisch.. wenn ich ins valid schreibe, sagt der mir ich kann nicht auf this oder thisform zugreifen. Also denke ich mir gut, dann muss ich das wohl aufrufen.. aber this.valid klappt auch nicht.. kurz gesagt hier mein code
IF !USED("benutzer") THEN USE benutzer IN 0 ENDIF
SELECT benutzer IF this.Valid LOCATE FOR id = this.value IF !FOUND() MESSAGEBOX("Eingabe ist nicht korrekt!") ENDIF ENDIF
und wenn ich die valid abfrage ausklammer und nur die innere if abfrage stehen bleibt, also so
IF !USED("benutzer") THEN USE benutzer IN 0 ENDIF
SELECT benutzer LOCATE FOR id = this.value IF !FOUND() MESSAGEBOX("Eingabe ist nicht korrekt!") ENDIF
dann kommt bei jedem tastendruck die nachricht "Eingabe ist nicht korreckt!"...
Ich hab das dann auch mit SEEK id=this.value &&also in der interactiveChange, aber dann sagt der mir, dass die Index-reihenfolge nicht festgelegt wurde, aber ich hab den Index bei ID und den Namen auf aufsteigend gestellt und ID als primär definiert. In der Hilfe steht, dass man seek nur auf die Index-schlüssel anwenden kann, aber das ist doch hier der fall, oder nicht?
- Bearbeitet Schosch93 Mittwoch, 7. November 2012 09:43
Mittwoch, 7. November 2012 08:19 -
ok, mit dem interactiveChange bin ich nicht ganz glücklich geworden. Desswegen habe ich folgendencode
IF nKeyCode = 13 SET EXACT ON SELECT benutzer TRY SEEK this.Value CATCH ENDTRY thisform.Refresh ENDIF
ins KeyPress ereignis geschrieben.
So klappts, da gibt es nur noch eine sache, die mich da extrem stört, unzwar sobald ich eine ziffer eingebe verlirt das textfeld sofort den Fokus.. Das macht die eingabe ziehmlich unangenehm für den User.
Gibt es vielleicht eine möglichkeit, das das nicht mehr passiert?? dass ich einfach den maus-curser in das textfeld setze, der Eitrag auf "" gesetzt wird und ich dann frei, einfach so ohne Probleme eine Zahl mit beliebig vielen ziffern eingebe, auf enter drücke, dann der fokus aus dem textfeld springt und der code durchgefürht wird? Oder wie müssen die einstellungen sein, damit das so ist?
Mittwoch, 7. November 2012 11:56 -
>Sobald ich eine ziffer eingebe verlirt das textfeld sofort den Fokus.
Wie ist denn die Textbox eingestellt? Hast Du da eine Inputmask gesetzt, hast Du MaxLength gesetzt?
Wenn nicht, dann lassen sich unbeschränkt lange Zahlen oder Text eintippen, die Textbox setzt den Fokus von alleine nicht weg, nur weil Du ein Zeichen eintippst.
Vieleicht hast Du in irgendein Refresh() Event einprogrammiert, daß der Fokus irgendwohin gesetzt wird, was man im Refresh nicht tun sollte.
Und probiere das VALID() Event aus, das kommt sowieso nur einmal, wenn man RETURN oder TAB tippt oder mit der Maus woanders hin klickt. Das KeyPress oder InteractiveChange brauchst Du nur dann, wenn Du interaktiv zu jedem getippten einzelnen Buchstaben eines Namens schon zum ersten Datensatz springen willst, der auch so beginnt. Wenn das gar nicht Deine Idee ist, dann ist es übertrieben, die Suche dort zu machen.
Im VALID hast Du keine Angabe über den Tastencode, es kann Dir aber egal sein, warum der Fokus jetzt im Begriff ist, die Textbox zu verlassen. Die Eingabe ist in jedem Fall dann beendet und die Suche kann den aktuellen Value suchen.
Tschüß, Olaf.
- Bearbeitet Olaf Doschke Mittwoch, 7. November 2012 13:47
- Als Antwort markiert Schosch93 Mittwoch, 7. November 2012 15:47
Mittwoch, 7. November 2012 13:45