EN_KILLFOCUS beim Beenden eines Dialogs



  • Hi!
    Ich frage bei einem CEdit in einem Dialog die Nachricht EN_KILLFOCUS ab, um zu checken, das der User korrekt ausgefüllt hat. Wenn nicht, ploppt eine MessageBox hoch.
    Dummerweise kommt EN_KILLFOCUS auch beim Beenden des Dialogs (irgendwie ja auch klar).
    Frage: Wie kann ich eine zusätzliche Bedingung einbauen, damit beim Beenden nicht jedesmal eine Warnung wegen falschen Einträgen im Edit kommt?

    Thx schonmal 🙂

    Gruß T.



  • Hallo.

    Würde es da nicht reichen, eine Variable abzufragen die beim schließen des Dialoges auf einen bestimmten Wert gesetzt wird

    if (!close)
     // Fenster wird nicht geschlossen
    else
     // Fester wird geschlossen
    

    Du muß nur jede Möglichkeit zum Schlißen des Dialoges abfangen und die Variable setzen und nicht vergessen die Variable beim Öffnen des Dialoges zu initialisieren.

    Hoffe es hilft Dir weiter.

    Oli



  • So langsam frage ich mich, ob EN_KILLFOCUS überhaupt die richtige Message ist. 😞
    Denn EN_KILLFOCUS kommt natürlich ja auch, wenn man einfach mal neben das Programm auf den Desktop klickt. Das kann es irgendwie ja nicht sein...
    Sonst bleibt mir wohl nur, die Variablen vor dem Eintrag in die DB zu überprüfen, mal sehen...

    Gruß T.



  • Hihi,

    genau das gleiche Problem hab ich auch. Allerdings mich noch nicht weiter mit beschäftigt da mein Formular noch nicht fertig ist. Aber wenn man den Dialog beendet und was falsches in einem Edit steht, dann hängt man in einer Schleife, weil die KillFocus Funktion andauernd wieder ausgeführt wird.

    kann man denn nicht beim beenden einfach die EN_KILLFOCUS Message wegschmeissen? Das werd ich mal versuchen, dann bräuchte man nur beim beenden des Dialogs eine BOOL-Var setzen die dann in der PreTranslateMessage abgefragt wird, wenn die Message denn gepostet wird..

    mal gucken..



  • Okay,

    nach kurzem Studium der MSDN bin ich auf folgendes gekommen:

    PreTranslateMessage geht natürlich nicht 😃 Weil die Nachricht direkt an die WindowProc geschickt wird. Da EN_KILLFOCUS eine WM_COMMAND message ist bleiben uns also noch die WindowProc() und die onCommand() Funktion in der wir die Nachricht abfangen können.
    Da ich nicht weiss ob/wie ich in der OnCommand-Funktion die Msg verändere, man hat ja nur die Parameter wParam und lParam, habe ich die WindowProc() benutzt.

    if(bDlgEnded)  // Schaltervariable prüfen
    		if(message == WM_COMMAND)
    			if(HIWORD(wParam) == EN_KILLFOCUS)
    				message = 0;
    
    	return CDialog::WindowProc(message, wParam, lParam);
    

    Damit klappt es bei mir auf jeden Fall. Ob es noch schönere/bessere alternativen gibt weiss ich nicht. Wär aber dankbar für Infos.



  • Hm, ich glaube das funzt so nicht...
    Zu welchem Zeitpunkt soll denn Deine BOOL gesetzt werden? Beim Beenden?
    Sobald Du per Maus irgendwelche Buttons zum Beenden drückst, kommt zuerst nochmal EN_KILLFOCUS dran. 😉
    Das gilt für JEDE Aktion mit der Maus die nicht das Edit betrifft. EN_KILLFOCUS kommt also auch bei anderen Gelegenheiten, z.B. wenn man neben den Dialog auf den Desktop klickt...
    Trotzdem erstmal danke für Deinen Vorschlag, ich muss mir nochmal irgendwie etwas Anderes zur Kontrolle der Edits einfallen lassen 👍

    Gruß T.



  • Ja, da hast du Recht.

    Allerdings find ich das auch ganz sinnvoll. In dem Moment wo du irgendwohin klickst geht der Focus der edits doch auch verloren. Wenn ich in ein anderes Fenster klicke verlasse ich das Edit. Bzw. kann ich ja beim wiederanklicken des Dialogs direkt ein anderes Edit auswählen.

    Ich finde das eigentlich ganz sinnvoll. Nur bei OnClose() soll er halt nicht mehr überprüfen. Ich habe im Konstruktor die BOOL-Var auf false gesetzt, den Dialog modal geöffnet und bei OnClose() dann die Var auf true.

    Aber wenn er bei dir beim Fenster verlassen nicht nachfragen soll musst du die Überprüfungen wohl am besten komplett am Ende überprüfen lassen, oder sowas..


Anmelden zum Antworten