Announcement

Collapse
No announcement yet.

Form aus DLL im OnExit eines TEdit

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Form aus DLL im OnExit eines TEdit

    im onexit einer tedit komponente oeffne ich via dll ein tform ( shomodal ).das form hat rein informativen charakter. nach dem schliessen des forms stehe ich auf der naechsten tedit komponente. ich sehe aber keinen cursor mehr und der inhalt der tedit komponente ist auch nicht markiert. ( onenter des tedit wird nicht ausgefuehrt ! ) woran liegt das?

  • #2
    Hallo,

    Windows definiert strenge Regeln, die bei der Fokusweiterschaltung eingehalten werden müssen. Beim Wechsel des Fokusses sind immer 2 Stellen beteiligt: <br>
    1. Das Control, das den Fokus verliert, und <br>
    2. Das Control, das den Fokus erhält. <br>
    Sobald nun die eigene Anwendung als Reaktion auf OnExit den Fokus selbst ändert (Standardbutton im Dialog), wird dieser Mechanismus unterbrochen.

    Ich würde daher in der Ereignisbehandlungsmethode für OnExit eine private Botschaft über PostMessage an das eigene Formular schicken. Und in der Botschaftsbehandlungsmethode für diese private Botschaft wird das Formular aus der DLL aufgerufen. Auf diesem Weg stellt man sicher, das das Formular erst dann aufgerufen wird, wenn Windows alle beim Fokuswechsel beteiligten Botschaften <b>vorher</b> abgearbeitet hat

    Comment


    • #3
      hallo herr kosch
      vielen dank. bei informativen forms ist mir so geholfen.

      nun habe ich aber noch forms die entscheiden ob ich das editfeld verlassen darf oder nicht. wenn ich das via postmessage mache wird leider das DoEnter des naechsten editfeldes aufgerufen. wissen sie nicht per zufall noch einen anderen loesungsweg?

      besten dan

      Comment


      • #4
        Hallo,

        offiziell lässt Win32 keinen anderen Weg zu. Ich würde daher den Fokus immer dann auf die TEdit-Instanz zurücksetzen, wenn die Plausibilitätsprüfung eine fehlerhafte Eingabe ergibt.

        Alternativ könnte man mit der Eigenschaft <b>ActiveControl</b> oder mit der API-Funktion <b>ShowCaret</b> experimentieren, um den Cursor wieder sichtbar zu machen

        Comment


        • #5
          vielen dan

          Comment


          • #6
            Hi

            <pre>

            procedure Edit1Exit(...);
            begin
            // Focus auf das jeweilige Control setzen
            Windows.SetFocus(Edit1.Handle);
            // oder
            Application.ProcessMesages;
            // da die cm_Enter/cm_Exit Botschaften die OnEnter/OnExit auslösen in
            // den Messagequeqe GEPOSTET ,PostMessage(), werden.

            Dialog.ShowModal;

            // alternativ noch

            SendMessage(ActiveControl.Handle, wm_SetFocus, 0, 0);
            // oder
            ActiveControl.Perform(cm_Enter, 0, 0);
            // um ein OnEnter Event auszulösen
            end;

            </pre>

            gruß Hage

            Comment

            Working...
            X