none
wie aktive Textbox ermitteln?

    Frage

  • Hallo, Ihr Wissenden!

    Ich habe ein Formular mit einigen ungebundenen Textboxen. In einer Function möchte ich den gesamten eingegebenen Text der gerade aktiven Textbox auswählen.

    Wie kann ich in der Function ermitteln, welche der Textboxen die aktive ist und dann (mittels SelStart, SelLength?) den darin befindlichen Text markieren?

    Vielen Dank für Eure Mühen,

    RaiSta

    Montag, 1. Juli 2013 22:03

Antworten

  • Hallo RaiSta

    Die Textbox, die gerade den Focus hat, kannst Du mittels Screen.ActiveControl ermitteln.

    Falls Du allerdings auf eine Schaltfläche klickst, dann wird diese Schaltfläche den Focus haben. Du kannst dann mittels Screen.PreviousControl ermitteln, welches Steuerelement vorher den Focus hatte. Dabei verlierst Du allerdings die Markierung innerhalb der Textbox. Mit einigen Tricks könnte die Textbox beim Verlassen allerdings die SelStart und SelLength Eigenschaften in Formularweit gültige Variablen wegschreiben, so dass Du diese trotzdem noch benutzen kannst.

    Gruss

    Henry

    Dienstag, 2. Juli 2013 05:58
  • Hallo RaiSta

    Ob Screen, Me oder Form hat geringfügige Unterschiede, welche Du vermutlich in der Praxis nicht bemerkst.

    Ich benutze lieber Screen.ActiveControl, da es sowieso nur ein aktives Control in Access geben kann, nämlich das des Objekts, das gerade den Focus hat.

    Mit Me.ActiveControl ist Dein Code an das Formular gebunden und es ist u.U. nicht das Control, welches den Focus hat. Zudem läuft dieser Code nur im Formular selber. Du musst den Code also auf Forms("FormularName").Active Control umbauen und den FromularNamen an übergeben, wenn Du den Code mal in ein Standard Modul auslagern und von anderen Formularen aufrufen willst (Re-Facturing). Mit Screen.ActiveControl erhälst Du das Control von Access, das gerade den Focus hat.

    In Deinem Fall kannst Du auch Me. verwenden. Nichts zu schreiben, also Me. wegzulassen ist allerdings nicht günstig, weil Du dann nicht sofort siehst, welches Du gerade benutzt und eben z.B. beim Re-Facturing dann nicht merkst, dass Du da statt dessen das Form Objekt ansprechen müsstest.

    Gruss

    Henry

    Mittwoch, 3. Juli 2013 05:45

Alle Antworten

  • Hallo RaiSta

    Die Textbox, die gerade den Focus hat, kannst Du mittels Screen.ActiveControl ermitteln.

    Falls Du allerdings auf eine Schaltfläche klickst, dann wird diese Schaltfläche den Focus haben. Du kannst dann mittels Screen.PreviousControl ermitteln, welches Steuerelement vorher den Focus hatte. Dabei verlierst Du allerdings die Markierung innerhalb der Textbox. Mit einigen Tricks könnte die Textbox beim Verlassen allerdings die SelStart und SelLength Eigenschaften in Formularweit gültige Variablen wegschreiben, so dass Du diese trotzdem noch benutzen kannst.

    Gruss

    Henry

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

    Dank für Deine Antwort! Die 'ActiveControl' Property hatte ich im 'Me'-Objekt auch gefunden, sie bot mir jedoch nicht die Text-Eigenschaft an (was bei der Generalität von 'ActiveControl' auch nicht weiter verwundert...). Daher hatte ich gestern an der Stelle aufgegeben.

    Angeregt Durch Deine Antwort habe ich noch mal drüber nachgedacht und verwende nun

        Dim objTxb as TextBox
        ...
        If ActiveControl.ControlType = acTextBox Then   'prüfe, ob aktuell ausgewähltes Objekt eine TextBox ist
            Set objTxb = ActiveControl
        End If

    Damit kann ich dann via 'objTxb' auf die aktive Textbox zugreifen (so denn eine solche aktiviert ist) und meine Aktivitäten durchführen, da ja das TextBox-Objekt 'objTxb' die 'SelStart'- und 'SelLength' Properties bietet.

    Ach ja: eine Frage bleibt mir noch: warum hast Du als Parent für 'ActiveControl' das 'Screen'-Objekt verwendet? Warum nicht 'Me', oder, wie in meinem Code-Schnipsel, einfach 'ActiveControl' ohne Parent-Angabe?

    Gruß,

    RaiSta


    • Bearbeitet RaiSta Dienstag, 2. Juli 2013 11:49 vergessen...
    Dienstag, 2. Juli 2013 11:46
  • Hallo RaiSta

    Ob Screen, Me oder Form hat geringfügige Unterschiede, welche Du vermutlich in der Praxis nicht bemerkst.

    Ich benutze lieber Screen.ActiveControl, da es sowieso nur ein aktives Control in Access geben kann, nämlich das des Objekts, das gerade den Focus hat.

    Mit Me.ActiveControl ist Dein Code an das Formular gebunden und es ist u.U. nicht das Control, welches den Focus hat. Zudem läuft dieser Code nur im Formular selber. Du musst den Code also auf Forms("FormularName").Active Control umbauen und den FromularNamen an übergeben, wenn Du den Code mal in ein Standard Modul auslagern und von anderen Formularen aufrufen willst (Re-Facturing). Mit Screen.ActiveControl erhälst Du das Control von Access, das gerade den Focus hat.

    In Deinem Fall kannst Du auch Me. verwenden. Nichts zu schreiben, also Me. wegzulassen ist allerdings nicht günstig, weil Du dann nicht sofort siehst, welches Du gerade benutzt und eben z.B. beim Re-Facturing dann nicht merkst, dass Du da statt dessen das Form Objekt ansprechen müsstest.

    Gruss

    Henry

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

    danke für diese sehr praxisbezogene Antwort! Das ist für mich sehr gut nachvollziehbar und ergibt in sich Sinn!

    Vielen Dank noch mal,
    RaiSta

    Mittwoch, 3. Juli 2013 10:31