Problem mit EM_GETMODIFY & EM_SETMODIFY



  • Hallo,
    ich habe mir eine Recordset Klasse geschrieben, von der aus ich Steuerelemente die ich mit dem recordset verknüpft habe überprüfen kann ob diese vom Benutzer modifiziert wurden. Bei Steuerelementen die das von hausaus nicht unterstützen klappt das sehr gut. Anbei diese Steuerelemente sind alle in eigenen klassen verankert.
    Im falle von den Edit Steuerelementen bin ich auf ein problem gestoßen das mich fast verzweifel lies.

    Wenn ich mittels WM_SETTEXT Text in ein Edit Steuerelement setze, wird der Flag nicht automatisch von Windows gesetzt. Warum ? es ist doch eine änderung im Steuerelement. Ich hab auch schon versucht den Flag selber mittels EM_SETMODIFY unter WM_SETTEXT in der Nachrichtenroutine des Edit Steuerelementes zu setzen. indem ich dort WM_SETTEXT abfange.

    Das klappt aber nur bedingt. Nämlich nur innerhalb der abgefangenen Nachricht von WM_SETTEXT, wenn ich EM_SETMODIFY dort auf True setze und direkt danach EM_GETMODIFY abfrage ist der Wert TRUE. Fang ich aber die EN_CHANGE Nachricht ab die ja direkt anschliesend an WM_SETTEXT gesendet wird, ist EM_GETMODIFY False. gibt es dafür eine vernünftige erklärung?

    EM_GETMODIFY ist nur TRUE und bleibt auch TRUE, wenn ich mit der maus ins Edit Steuerelement klicke und selbst eine eingabe mittels der Tastatur o. Strg+V mache.



  • Windows weis alles besser... anderst kann man es nicht beschreiben.

    ich kann es mir nur dadurch erklären, nach dem ich jetzt mehrer tage darüber nachgedacht, ablaufverfolgungen geschrieben und in der MSDN gestöbert habe.
    WM_SETTEXT aktualisiert nicht den Flag für die Modifizierung in einem Edit Steuerelement. Was ja an sich schon hirnrissig genug ist. nein der schwachsinn geht noch weiter.

    Fängt man wie ich es versucht habe in der Nachrichtenroutine des Edit Steuerelementes WM_SETTEXT ab, um den Flag für die Modifizierung selbst zusetzen, dann fängt windows auf einmal an selbst nachzudenken und weis es wiedererwartend besser. 😡

    Fängt man die Nachricht WM_SETTEXT ab, ist ja an dieser Stelle das Edit Steuerelement noch gar nicht aktualisiert (hier kam so der erste ah effect bei mir) setzt man nun mittels EM_SETMODIFY den Flag des Steuerelementes innerhalb von WM_SETTEXT auf TRUE passiert anscheinend folgendes.

    hier fängt Windows auf einmal an nachzudenken. 😮
    Das Steuerelemet ist nicht aktualisiert (es steht ja noch kein text drin). Aber mein Flag für das Steuerelement in das ich einen Text setzen soll, steht auf Aktualisiert 😕 ... das kann nicht sein. das muss ich ändern. Ich stell das mal schnell um auf nicht aktualisiert. Und danach setze ich den Text in das Steuerelement das ich mittels WM_SETTEXT aktualisieren soll.
    Und dabei vergess ich mal ganz klamheimlich den Flag für die Aktualisierung auf TRUE zu stellen.

    Wie peinlich ist das denn...
    naja egal ich habs jetzt gelöst. dann muss ich halt jedes Edit Steuerelement einzeln ansprechen und kann nicht den kompfortablen weg gehn es automatisch machen zu lassen.


  • Mod

    Ich halte das Verhalten für korrekt, wenn man die Doku betrachtet:

    The system automatically clears the modification flag to zero when the control is created. If the user changes the control's text, the system sets the flag to nonzero. You can send the EM_SETMODIFY message to the edit control to set or clear the flag.

    D.h. WM_SETTEXT behält den Status bei.



  • ja das hab ich auch gelesen. schon vor tagen...
    ABER WM_SETTEXT ändert nunmal den Text im Edit Steuerelement. Also warum wird dann der Status des Flag nicht geändert. oder zumindest einen hinweis darauf das der Flag nicht geändert wird.

    Auch steht ja da ganz klar, das

    ...You can send the EM_SETMODIFY message to the edit control to set or clear the flag...

    was aber nicht ganz stimmt. denn ändere ich den status des Edit Steuerelementes auf TRUE, bevor der Text mittels WM_SETTEXT gesetzt wurde. bzw. erfährt das steuerelement keine Änderung. wird EM_SETMODIFY übergangen o. revidiert.

    und das steht da nirgends.


Anmelden zum Antworten