UpdateData() in mehreren Dialogen?



  • Was soll ich dir noch sagen. Habe es ja schon. Du hast bereits eine Instanz. Diese musst du benutzen. Um es in C auszudrücken:

    "Du legst ein Variable mit Inhalt an. In einer anderen Funktion legst du eine neue Variable mit Inhalt an welche genauso heißt wie die andere weil du glaubst dann kommst du an den Inhalt."

    So hast du es gemacht.

    Was du brauchst ist aber die erste Variable. (In deinem Fall also die Klasseninstanz)

    Wenn ich dir die Lösung direkt sagen würde wäre das "AHA-Erlebniss" bei dir nicht da und somit der Lerneffekt gering.



  • Ich kapier nicht worauf du hinaus willst. In meiner OnInitDialog-Funktion habe ich doch nur die Membervariable vom Typ CMyCtrlTab vom TabCtrl-"Baustein" des Hauptdialogs, welche die Init()-Funktion der CMyTabCtrl-Klasse aufruft ("m_MyTabCtrl.Init();" - ich benutze diese Klasse hier). Dort werden doch die einzelnen Seiten erst im Konstruktor erzeugt. Ich habe also nur die Membervariable im Hauptdialog. Folgender Ansatz funktioniert auch nicht so ganz (selber Crash):

    CDialog *pDlg;
    pDlg = m_MyTabCtrl.m_tabPages[2]; // in 2 wird der Dialog mit dem Edit-Feld erzeugt
    pDlg->UpdateData(false);
    

    Geht das wenigstens in die richtige Richtung?

    "Du legst ein Variable mit Inhalt an. In einer anderen Funktion legst du eine neue Variable mit Inhalt an welche genauso heißt wie die andere weil du glaubst dann kommst du an den Inhalt."

    Ja, so in etwa (auch wenn sich das in C total absurd anhört 😮). Ich dachte eben, dass wenn ich mit dieser Instanz ein UpdateData() ausführe, dann die Dialoge mitaktualisiert werden. Aber so wie du das beschreibst ist das natürlich Bullshit. 😃

    zony



  • Das selbe hört sich auch in C++ total Absurd an 🤡

    Wieso möchtest du Dialoge aktualisieren,die gerade nicht Aktiv sind? Wäre es nicht
    einfach die Werte in die membervariablen zu schreiben und wenn der Dialog den Focus
    erhält einfach die Daten aktualisieren?



  • Ich habe einen Reiter, in dem ein Editfeld ist. Diesen wähle ich an und dann klicke ich im "Hauptdialog" auf einen Button und dann soll das Editfeld gefüllt werden. Dann hat dieses bzw. dessen Dialog ja nicht den Focus (wenn ich den Reiter vorher wechsle sieht das vielleicht anders aus). Der Knopf liest Daten von der seriellen Schnittstelle, welche diverse Informationen auf die verschiedenen Reiter verteilen soll. Wenn ich also den Connect-Button drücke, sollen die Daten laufend auf allen Seiten aktualisiert werden, so dass ich, egal ob ich gewechselt habe (Focus) oder nicht, aktuelle Informationen präsentiert bekomme. Daher möchte ich die Dialoge auf allen Seiten aktualisieren, sobald neue Daten von der Schnittstelle verfügbar sind.

    zony



  • Wie siehts denn nun aus? Unix-Tom? 😕

    zony



  • Also es sind Grundlagen und keiner kann mir helfen? Schade eigentlich... 😞

    zony



  • Du hast in einer deiner Hauptklassen bereist Klasseninstanzen deiner Dialoge. Richtig?

    Jetzt brauchst du nur diese Instanz nehmen und kannst damit auf den Dialog zugreifen.

    Was du gemacht hast ist eine neue Instanz erstellt.
    Da deine Dialogklasse aber bereist existiert kannst du dir entweder den Zeiger darauf holen oder in deiner Hauptklasse mittels der Instanzvar auf den Dialog zugreifen.



  • Ja, aber soweit waren wir ja bereits, siehe dieses Posting:

    Ich kapier nicht worauf du hinaus willst. In meiner OnInitDialog-Funktion habe ich doch nur die Membervariable vom Typ CMyCtrlTab vom TabCtrl-"Baustein" des Hauptdialogs, welche die Init()-Funktion der CMyTabCtrl-Klasse aufruft ("m_MyTabCtrl.Init();" - ich benutze diese Klasse hier). Dort werden doch die einzelnen Seiten erst im Konstruktor erzeugt. Ich habe also nur die Membervariable im Hauptdialog. Folgender Ansatz funktioniert auch nicht so ganz (selber Crash):

    CDialog *pDlg;
    pDlg = m_MyTabCtrl.m_tabPages[2]; // in 2 wird der Dialog mit dem Edit-Feld erzeugt
    pDlg->UpdateData(false);
    

    Geht das wenigstens in die richtige Richtung?

    Hier erzeuge ich doch keine neue Instanz sondern erstelle einen Zeiger vom Typ CDialog, welche auf das entsprechende Objekt zeigen sollte. Crashed aber genauso. Biete mir doch bitte eine Lösung an. 😕

    zony



  • Wieso soll es auch. Eine Registerkarte ist kein Dialog sondern ein Control.
    Wenn dann musst du hier einen Zeiger auf die Controlklasse erstellen.
    Da du aber sowieso bereits das Handle hast (m_MyTabCtrl.m_tabPages[2]) warum willst du dann nochmals einen Zeiger erstellen.



  • Oh mein Gott, ich hab es. Habe hier nun gelesen, dass UpdateData() nicht threadsicher ist, damit funktioniert es nun:

    m_MyTabCtrl.m_tabPages[2]->SetDlgItemText(IDC_EDIT, m_sEdit);
    

    Danke für die Hilfe! 🙂

    zony


Anmelden zum Antworten