none
Wie kann ich Fokus-verlust verhindern?

    Frage

  • Hallo Ihr Wissenden,

    eine wahrscheinlich trivial zu beantwortende Frage:

    in einem Formular habe ich u.a. eine ungebundene Textbox. Nach Eingabe in die Box validiere ich den Eintrag. Sollte das Ergebnis ungültig sein, möchte ich verhindern, dass die Box den Fokus verliert, egal was der Benutzer gemacht hat (TAB-Taste gedrückt, mit Maus woanders hin geklickt, ENTER gedrückt, etc.).

    Wie kann ich das erreichen? Habe leider nichts in der Hilfe gefunden und ebenso nichts im Forum.

    Vielen Dank,

    RaiSta

    Montag, 1. Juli 2013 23:42

Alle Antworten

  • Hallo RaiSta

    Du kannst das im Control_BeforeUpdate Ereignis realisieren:

    Public Sub DeineTextBox_BeforeUpdate(Cancel as Integer)
      If Nz(Me!DeineTextBox, "") <> "gültiger Eintrag" Then
        MsgBox "Sie müssen 'gültiger Eintrag' eingeben"
        Cancel = True
      End If
    End Sub

    Cancel = True verindert, dass die Textbox aktualisiert werden kann und da der Inhalt geändert hat, kann diese nicht mehr verlassen werden, bis Deine Validierung es erlaubt.

    Gruss

    Henry

    Dienstag, 2. Juli 2013 05:54
  • Hallo Henry,

    danke für Deine Antwort! Diese wirft für mich, als anfangender Access-VBA Nutzer ein paar Fragen auf:

    1. Kann ich auch das 'Exit'-Ereignis mit 'Cancel=True' verwenden? Das hätte den Vorteil, dass die Eingabe in der Textbox in die 'value'-property übernommen worden ist und ausgewertet werden kann.
    2. Was ist eigentlich der Unterschied zwischen 'Text' und 'Value' property, außer dass letztere erst nach dem 'Update'-Ereignis befüllt wird? Wird nur der Inhalt von 'Text' nach 'Value' kopiert oder durchläuft das noch Wandlungen (wovon ich ursprünglich ausging, mittlerweile aber Zweifel habe)?
    3. Gibt es eine Quelle, wo die einzelnen Ereignisse, was sie auslöst und unter welchen Randbedingungen sie auftreten, auflistet? Die Online-Hilfe bietet für die meisten Ereignisse nur an, wie eine entsprechende Behandlungsroutine programmiert werden kann, jedoch nichts, wann sie (nicht) auftreten, etc.

    Vielen Dank,

    RaiSta

    Dienstag, 2. Juli 2013 13:01
  • Hallo RiSta

    1. Ja, das kannst Du. Du kannst bei allen Ereignis-Prozeduren, welche den Cancel Parameter haben, das Ereignis abbrechen, indem Du Cancel = True setzt.
    2. Die Text Eigenschaft steht nur zur Verfügung, wenn das Control den Focus hat. Die Value Eigenschaft (Default-Eigenschaft) enthält den aktuellen Wert des Controls und steht erst zur Verfügung, wenn das Change Ereignis durchgelaufen ist. Bei gebundenen Controls hast Du noch die Eigenschaft OldValue, mit der Du den ursprünglichen Wert des Feldes auslesen kannst, um z.B. diesen mit dem Value zu vergleichen.
    3. Die Quelle ist die Online Hilfe. Am besten drückst Du einfach F1 und gibst dann im Suchfeld z.B. "OnExit Event" (wird evt. in Deutsch anders heissen, z.B. "OnExit Ereignis") ein und kannst dann dort im Ausgabe Bereich weiteruschen. Du kannst auch "Form Events" eingeben, um z.B. alle Events von Formularen angezeigt zu bekommen. Wenn Du dann die Information zu einem Event öffnest solltest Du darin auch die Reihenfolge der Events angezeigt erhalten.

    Gruss

    Henry


    Mittwoch, 3. Juli 2013 05:37
  • Hallo Henry,

    danke für Deine Antwort! Zu Punkt3: genau so etwas hatte ich gesucht - und nicht gefunden. So ist die Hilfe für das von Dir genannte 'OnExit'-Ereignis noch recht ausführlich, jedoch z.B. für das 'AfterUpdate'-Ereignis ziemlich nichts-sagend, insbesondere wird nicht beschrieben, wann dieses Ereignis ausgelöst bzw. dessen Auslösung verhindert wird, noch, wie es sich in die Reihenfolge eingliedert. Ähnlich verhält es sich z.B. auch für das 'Dirty'-Ereignis ('geändert' im deutschen Access). Laut Beschreibung wird es (für die Textbox!) ausgelöst, wenn sich der Inhalt des Formulars ändert. Doch habe ich in meinem Testformular bisher dieses Ereignis nicht auslösen können, noch habe ich irgendeine Vorstellung, wie es sich in die logische Abfolge der Ereignisse eingliedert.

    Insgesamt ist die Online-Hilfe für mein Empfinden an dieser Stelle sehr schwammig (teilweise auch schlicht falsch übersetzt, wenn z.B. in Beispielen gesagt wird, ein Formular müsse bei Nutzung des Beispiels ein Optionsfeld des namens OptionJa enthalten, die Ereignis-routine dann aber OptionYes bedient...) und es dauert, zumindest für mich, sehr lange, bis ich die Informationen erhalten habe, die ich suche.

    Nun bin ich mir im Klaren darüber, dass es sehr schwer ist, eine Hilfe zu schreiben, die wirklich alles abdeckt. Und vielleicht habe ich auch nur an den falschen Stellen oder mit den falschen Suchbegriffen gesucht. Daher meine Frage, an welcher Stelle ich das Thema 'Ereignisse' mal kompakt nachlesen kann mit logischer Abfolge, etc. So etwas wie das von Dir beschriebene 'Form Events' oder 'Form Ereignisse' wäre mir sehr recht - und gibt es so nicht (i.e. ich habs nicht gefunden...). Stattdessen werden alle möglichen Eigenschaften und Ereignisse (habe ich anfangs denn auch gleich mal verwechselt...), das 'form'-Objekt betreffend als einzelne Punkte im Suchergebnis gelistet, doch die geschlossene Darstellung - oder gar eine die möglichen Elemente in einem 'form'-Objekt beschreibende - fand ich nicht.

    Vielleicht sitzt auch hier das Problem vor dem Rechner, vielleicht suche ich einfach falsch?

    Wie auch immer: vielen Dank für Deine Ratschläge, viele davon waren für mich sehr hilfreich!

    Gruß,
    RaiSta

    Nachtrag: Ich habe gerade eben mal mit dem Suchbegriff 'Textbox.dirty' gesucht, anstatt nach markieren von 'Dirty' im Code F1 zu drücken - und bin so zu deutlich informativeren Aussagen gekommen (ich vermute, 'Dirty' funktioniert nur bei gebundenen Textboxen?). Und: am unteren Seitenrand der Hilfe gibt es den Punkt 'Siehe auch' und dort den Link 'Elemente des TextBox-Objekts' --> hier komme ich zu einer Auflistung aller die TextBox betreffenenden Ereignisse - zwar auch wieder nicht mit logischer Abfolge, jedoch mit teilweise informativeren Texten.

    • Bearbeitet RaiSta Mittwoch, 3. Juli 2013 10:47 Ergänzung
    Mittwoch, 3. Juli 2013 10:18