Dialog - OnChange kommt nicht an (Message Reflection)



  • Hallo!

    Ich habe ein CFormView mit einem Edit drauf (IDC_EDT_VERST_LI). Das hat einen Spinbutton (Autobuddy). Soweit funktioniert auch alles.

    Dann habe ich einen Handler für EN_CHANGE erstellt:

    void CErgebnisView::OnChangeEdtVerstLi() 
    {
    	if (m_edtDvLi.m_hWnd) // Breakpoint 1
    	{
    		UpdateData(TRUE); // Breakpoint 2
    		m_strDvLi.Format(_T("%d"), 100 - atol(m_strVerstLi));
    		UpdateData(FALSE);
    	}
    }
    

    Da kommt der auch einmal vorbei, nämlich beim Erstellen des Formulars. Da aber auch nur bei Breakpoint 1, Breakpoint 2 wird nie getroffen.
    Aber später nie wieder, egal wie ich an dem Editinhalt rumändere.

    Wieso? 😕



  • Hast du vielleicht mal versucht, dir eine eigene CEditBox-Klasse zu schreiben, in der du diese Funktion einfach überschreibst?
    Kann das aber vielleicht nachher auch mal bei mir testen. Bin gerade ein wenig beschäftigt. 😉



  • Ja, ich habe eine eigene Editklasse. Die hat auch ein OnChange.
    Da komme ich auch rein. 😮

    Wie gebe ich da frei, dass die Nachricht auch vom Formview bearbeitet werden soll?

    void CMyEdit::OnChange() 
    {
    	if (!m_strErlaubt.IsEmpty())
    	{
    		CString strAlt, strNeu;
    		GetWindowText(strAlt);
    
    		for (int i = 0; i < strAlt.GetLength(); i++)
    		{
    			if (-1 != m_strErlaubt.Find(strAlt.GetAt(i)))
    			{	// Das Zeichen ist erlaubt, also kopieren
    				strNeu += strAlt.GetAt(i);
    			}
    		}
    
    		if (strNeu != strAlt)
    		{
    			SetWindowText(strNeu);
    			SetSel(strNeu.GetLength(), strNeu.GetLength());
    		}
    	}
    }
    

    m_strErlaubt ist leer.



  • Tut mir leid, aber ich verstehe dich gerade nicht ganz. 🙂
    Du kommst nun in diese Funktion, aber was läuft nicht? Soll in m_strErlaubt was drinstehen?

    [quote=estartu]Wie gebe ich da frei, dass die Nachricht auch vom Formview bearbeitet werden soll?[/quote]
    Du meinst also praktisch das, was du oben gefragt hast?

    Ist schon ein langer Tag. 🤡



  • Das Edit ist ein CMyEdit, deswegen kommt der in die OnChange (danke, da war ich nicht drauf gekommen).
    CErgebnisView ist ein CFormView, auf dem das Edit liegt und DER soll auch mitkriegen, dass sich da was ändert, weil dann der Inhalt eines anderen Edit automatisch angepasst werden soll.

    Scheinbar verschluckt CMyEdit::OnChange() aber die EN_CHANGE Nachricht - und das will ich verhindern... wie?



  • falls du keine bessere lösung findest, kannst du immer noch versuche die nachricht selbst zu senden. ist zwar komisch und weißt dann auch nicht warum es nicht automatisch gesendet wird, aber es geht dann (vielleicht ;))

    hatte auch mal so ein ähnliches problem, daher die idee



  • Stimmt, das wäre eine Möglichkeit.
    Allerdings iritiert mich das Verhalten insgesamt doch etwas, da bei anderen Controls keine Probleme in der Art aufgetreten sind. 😕



  • Also, ich habe mir auch eine SDI (CFormView) mit einer Edit-Box erstellt.
    Dann habe ich im Ressourcen-Editor einen Event-Handler für diese Edit-Box erstellt (benutze .NET 2003). Dieser Handler befindet sich in der View.
    Zur Überprüfung erscheint immer nur eine MessageBox.

    Aber, es funktioniert hier bei mir?!?



  • in MyEdit:
    ON_CONTROL_REFLECT ==> ON_CONTROL_REFLECT_EX

    BOOL CMyEdit::OnChange()
    {
      // ... your code ..
       return FALSE; // nö, hab gar nix gemacht! :=)
    }
    

    Der MFC Reflection-Mechanismus erlaubt normalerweise, über den Rückgabewert anzugeben, ob die nitification weiter geroutet werden soll (TRUE: notify "schlucken")
    Problem: der normale ON_CONTROL_REFLEC-Handler erlaubt keinen Rückgabewert, dafür gibt es ON_CONTROL_REFLEXT_EX und ON_NOTIFY_REFLECT_EX. Das ist alles in msdn: TN062 versteckt.



  • Peterchen, die OnChange ist bei mir eine void. 😕
    Aber ich guck mal, ob ich das TN062 verstehe.

    Paul, hast du auch mit einer eigenen Editklasse ausprobiert? Weil normale Edits würden vermutlich funktionieren, aber ich brauche einige Extrafunktionen.



  • In MyEdit.h mußt du ON_CONTROL_REFLECT durch ON_CONTROL_REFLECT_EX ersetzen (und natürlich OnChange als BOOL deklarieren).



  • @estartu: ne, sorry, das habe ich vergessen. Werde es aber noch mit einer eigenen Klasse Versuchen. 😉
    EDIT: Solange ich in einer selbstabgeleiteten Klasse keine OnChange() - Behandlung hinzufüge funktioniert es. Füge ich aber hinzu, dann tritt der von dir beschriebene Fall ein, dass die Anwendung die Nachricht nicht empfängt.
    Empfängt die Anwendung vielleicht etwas anderes?



  • peterchen schrieb:

    In MyEdit.h mußt du ON_CONTROL_REFLECT durch ON_CONTROL_REFLECT_EX ersetzen (und natürlich OnChange als BOOL deklarieren).

    Ich kann ON_CONTROL_REFLECT da nicht finden. 😮
    Und nur den Rückgabewert ändern geht vermutlich schief. 🙄



  • also, wenn ich mir mit Spy++ die Nachrichten anschaue, dann erhält meine Anwendung direkt nach Eingabe eines Buchstaben eine "unknown" Nachricht.
    Aber vielleicht kenne ich mich mit Spy++ noch nicht so gut aus. 😉



  • Ups, MyEdit.cpp, in der Message Map 🙂
    da müßte sowas wie

    ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
    

    drinstehen - sonst halt mal mit dem Debugger ranhängen, wer das OnChange denn aufruft.

    (normalerweise OnChildNotify ==> ... ==> _AfxDispatchCmdmessage ==> OnChange)



  • Juchuuu, es geht. 👍
    Dankeschön peterchen, ich glaube, das hätte ich nie gefunden. Wie sucht man sowas? Oder war das "gewusst wo"?



  • Gut zu wissen. Wie wäre es mal mit "ab in die FAQ"?
    Mir kam das mit dem Reflect irgendwie bekannt vor, jetzt weiß ich auch woher:
    estartu, schau mal in deinem Thread zur Suche in der MSDN. Da habe ich einen Link zu den Technical Notes geschrieben. Zufälligerweise ist das die TN zu Reflection!
    🤡
    Zufälle gibt's, die gibt's nicht.



  • Okay, ab in die FAQ - ich überleg schon die ganze Zeit. 😃
    Das mit dem Link ist ja spaßig... und wir denken BEIDE nicht dran. 🤡


Anmelden zum Antworten