Aufruf von UpdateData(False) in DoDataExchange


  • Mod

    @CTecS: Sehe ich genauso!



  • @CTecS
    1. Wieso soll ich kein UpdateData benötigen. Also statt einem eigens angelegtem Feld in der View verbinde ich meine ID des Controls mit dem Property aus dem Model über das DDX_Text Makro.

    Um nun den Wert aus dem Control in das Property zu schreiben muss ich ja UpdateData aufrufen. Oder wie kann man das anders machen?

    2. Die Propertys wissen dass Sie betroffen sind. Die werfen eine PropertyChanged Event und informieren alle die sich an dem Event registiert haben.

    Aber:
    Mir war bisher nicht klar dass man einzelne Dialogfelder auch einzeln beschreiben kann.

    Mit:
    SetDlgItemText(nIDC, value);
    GetDlgItem(nIDC)->RedrawWindow();

    Das bring mich schon mal ein Stück weiter.


  • Mod

    Du kannst natürlich mit GetDlgItemText/Int etc und GetWindowText die Daten jederzeit auch holen.

    DoDataExchange macht intern nicht anderes... debugge doch hinein.



  • Hallo Martin

    DoDataExchange macht ja an sich gar nichts. Oder das ist ja die Methode in der ich meinen Code platzieren um die Daten auszutauschen. z.B. mit DDX_Text.

    Nehmen wir mal an: ich möchte die Änderungen erst dann in die Model Schicht schreiben wenn jemand einen Button drückt. Dann müßte ich ja jedes Control durch gehen und es auslesen.

    Und dass würde ich gerne mit meinem Framework umgehen. Sprich ich verbinde meine Property im Model mit der ID des Controlls über DDX Text.

    Dann gibt es verschiedene Trigger die bestimmen wann die Daten ausgetauscht werden.
    Explicit
    Bei Änderung
    Lost Focus

    Und in diesem Trigger wird / sollte dann nur noch UpdateData(True) aufgerufen werden

    Sobald sich eine Property im Model ändert wird ein Event geworfen und die Daten in der View müssen aktualisiert werden. Und das durch den Aufruf UpdateData(False).



  • So kann man das machen, muss man aber nicht. 😃

    Ich würde einfach die paar Steuerelemente ob das nun ein CEdit oder CCombobox oder was auch immer in einer für das elemt entsprechenden Klasse ableiten also dann als CMyEdit zum Beispiel und diese direkt mit den entsprechenden Variablen verbinden, also das Steuerelement aktalisiert seine Daten entsprechen dem geworfenen Event. So muss mann dann auch nicht die ganzen Sachen 2 mal Speichern und bekommt dann auch keine Probleme mit Dateninkostistenzen.

    Aber du kannst das natürlich auch mit DDX_ aufrufen oder Membervariablem oder halt SetDlgItemText und GetDlgItemText oder sonst wie machen, kommt immer drauf an wie groß das ganze werden wird.

    Es gibt immer viele Lösungen für ein Problem nur sind einige dann auch später mehr ein Klotz als eine Lösung und der Datenaustausch zwischen View und Membervariable kann man in einer einfachen Dialoganwednung mit paar Elementen durchaus benutzen, sollte aber eine Datenklasse dazu kommen die aktiv dann noch mit den Daten arbeitet, kann es schnell dazu kommen das man mehr Probleme hat als man sich wünscht und dann geht die sucherei los.

    Aber sei es drum wenn du das so machen willst, dann hast hast du doch eigentlich schon deine Lösung für dich fertig gebastelt. Der Datenaustausch sollte ja so gehen wie du das beschrieben hast.



  • Hallo CTecS

    Welche paar Steuerelemente? Ich möchte ein Framwork machen, bei der ich jede ich beliebige Property an jedes x-beliebige Controll binden kann. und hierbei auch n:n Beziehungen wenn es sein muss. Und hierbei dann so wenig wie möglich Schreibarbeit haben. Da ist ja ein Ableiten vom Control mehr hinderlich. Ein Klotz am Bein wie du so schön sagst.

    Kennst du WPF? Das ist das Grundprinzip auf das ich setze.


  • Mod

    Dann Verwende OnCmdMsg. Dort erreichen alle Änderungsnachrichten den Dialog. Ob Du nun einen Handler hast oder nicht.
    Irgendwo hinterlegst Du die Bindung des Controls und machst es eben selbst. Wie es in WPF auch eben festgelegt wird.

    DoDataExchange und austauschen aller Daten immer wenn ein Control sich ändert ist der falsche Ansatz.



  • "Dann Verwende OnCmdMsg"
    Aha. Ok. Mal anschauen, noch keine Ahnung was ich da machen muss.

    "Irgendwo hinterlegst Du die Bindung des Controls und machst es eben selbst."

    Ja das ist eine gute Idee. Irgendwo hinterlegen und es selber machen.
    Kann man das in die FAQs aufnehmen. Das ist sicher so manchen hilfreich 🙂

    Ok Spaß bei Seite aber so richtig hilft das nicht weiter.


  • Mod

    Habe mich vertan... es ist OnCommand.
    OnCmdMsg beeinflusst das Command Routing.

    Dann sag ich es anders. Im WPF hinterlegst Du auch Bindungen.

    Das wird in der MFC eben durch DoDataExchange gemacht. Wenn Dir das nicht reicht und Du was anderes (ein eigenes Frame Work willst) musst Du die Bindung Control -> Daten ja selbst vornehmen...

    Das meine ich.
    Was ist daran nicht hilfreich?
    Du willst was anderes als die MFC bietet: Mach es selbst!
    Auch das geht eben. Siehe WM_COMMAND OnCommand....



  • Was heißt wenn mir das nicht reicht.
    Ich nutze die Technik von MFC und schreibe Makros darum die mir es erlauben meine Propertys ohne eigenes Datenfeld in der View anzubinden.

    Und wie du sagst wird dass in MFC durch DataExchange gemacht. Also schriebe ich darum herum meine Makros.

    "Wenn Dir das nicht reicht und Du was anderes (ein eigenes Frame Work willst) musst Du die Bindung Control -> Daten ja selbst vornehmen... "

    "Du willst was anderes als die MFC bietet: Mach es selbst!
    Auch das geht eben. Siehe WM_COMMAND OnCommand...."

    Ok. Also das ist ja nun mal eine Antwort. Weiß zwar noch nicht wie und was aber ich schau mal.

    Warum wir nun ganz so viel Einträge produziert haben weiß ich nicht. Wüßte jetzt auch nicht wie ich meine Frage anders hätte formulieren sollen.

    Fragt man allgemein: "Wie mache ich ein Framework für MFC das über Databinding funktioniert", würde ich wohl die Antwort erhalten zeig erst mal was du hast und Frage gezielter.

    Frage ich erst dann wenn ich auf ein Problem stoße heißt es: Wieso machst du das so was hast du denn vor.

    Wie gesagt ich versuche ein Databinding zu machen mit MFC und kann hier nur die Techniken nutzen die ich kenne. Und das war bisher über DataExchange. Und da reicht mir dann nicht einfach nur die Antwort dann mache es halt selber. Das ist nicht hilfreich!


Anmelden zum Antworten