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?
Announcement
Collapse
No announcement yet.
Form aus DLL im OnExit eines TEdit
Collapse
X
-
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
-
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
-
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
-
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
Comment