Variable in anderen Dialog übertgeben



  • Hi, ich möchte in meiner Anwendung aus dem Dialog1 eine Membervariable
    befüllen (ist public) und dann in Dialog2 wieder auf den Wert zugreifen.
    Leider bleibt in Dialog2 die Zuweisung leer:

    Dialog1:
    
    void dia1::irgendwas()
    {
    
    m_var = "test"; //m_var ist ein CString
    
    }
    
    in Dialog2:
    
    #include "dia1.h"
    //..
    void dia2::machwas()
    {
    
    CString hierrein;
    dia1 xyz;
    hierrein = xyz.m_var;
    
    MessageBox(hierrein,"angekommen");//bleibt leer
    
    }
    


  • Works as implemented.

    Du machst eine "dia1" Instanz namens "xyz", die du nicht anzeigst, und wo du auch manuell nicht "dia1::irgendwas()" aufrufst.

    Wie also meinst du sollte der "erwartete" Wert in die Variable kommen?

    Wenn du in "machwas" den Dialog anzeigen willst, dann würde ich vorschlagen xyz.DoModal(); zu machen bevor du den String ausliest.



  • Ich rufe in einem Button die Funktion irgendwas(); auf.
    In Dialog2 ebenfalls in einem Button rufe ich dann machwas();

    Die MessageBox bleibt aber unbefüllt.



  • du musst schon in dia2::machwas() einen Zeiger oder die Referenz zu deinem dia1 Objekt haben und nicht mit >dia1 xyz< in dia2::machwas() eine neue Instance von dia1 erstellen, denn darin ist dein CString nun mal leer.
    Also je nachdem wer den anderen erzeugt, muss entsprechend einen Zeiger auf das andere Objekt mitgeben.



  • Hallo CTecS,
    magst du mir das in obigem Beispiel Code einmal aufzeigen?
    Ich schäme mich ja schon an den Grundlagen so lange zu kauen, aber
    ich würde es doch gerne sehen und verstehen 😞

    Ich möchte halt künftig in der Lage sein zwischen verschiedenen Klassen
    die Variablen weiter verwenden zu können.

    Ich bedanke mich schon mal für eure Hilfe und Geduld in diesem Forum! 👍



  • Ich muss leider mein obiges Problem nochmal etwas genauer beschreiben.

    Ich erstelle eine dialogbasierte Anwendung in der ich ein ListControl habe
    und ein DynTabCtrl (TabCtrl), welches wiederum einen randlosen untergeordneten
    Dialog beinhaltet.

    Aus meinem ListControl ermittele ich bei "Klick" auf einen Listeneintrag die
    Bezeichnung des Listeneintrags. Diesen Variablenwert (CString) möchte ich nun in dem
    Dialog innerhalb des TabControl verwenden.

    Den (randlosen untergeordneten) Dialog und den übergeordneten TabCtrl erzeuge ich wie folgt:

    m_dynTabCtrl.InsertItem(new infos(), "     Infos     ", IDD_INFOS);
    

    Im Dialog IDD_INFOS sollen nun die Werte verarbeitet werden.

    Ich habe bereits versucht so etwas wie Setter und Getter zu nutzen, aber die
    Variablen sind immer leer. Ich möchte einen Weg finden die Variablen aus dem
    ListControl des "Hauptdialoges", der außerhalb des Tab liegt, innerhalb des Tab-Dialoges zu verwenden.

    Oha ich hoffe es war halbwegs verständlich erklärt, was ich hier erreichen möchte 😞



  • um es mal einfach zu sagen, du musst in der Klasse von m_dynTabCtrl eine möglichkeit einbbauen, daten an einen entsprechenden Dialog weiter zu geben, da nur m_dynTabCtrl die zeiger auf die einzelnen Dialoge haben kann, kann nur diese Klasse die Daten weitergeben. das ist jetzt ohne weitere kenntnisse deiner entsprechenden Klassen (Projekt) schwer zu zeigen was man machen muss weil das alles auch hier den Rahmen sprengen würde und gekürzt nur noch mehr verwirrung schaffen würde



  • Ich vermute, dass ich mich dann an GetTab halten sollte. Mir ist aber noch nicht klar, wie ich dann mit dem Rückgabewert
    des CDialog Pointer weiter verfahre, um an den aktiven Dialog meine Variablen durch zu reichen:

    CDialog* DynTabCtrl::GetTab(int itab)
    {
    	if(m_tabs.size() > itab && itab > -1)
    		return m_tabs[itab];
    	return NULL;
    }
    

    Eine Idee wäre nun bei OnSetFocus zu reagieren und Variablen bereit zu stellen.
    Nur, überschreibe ich dann OnSetFocus dafür? Ich habe ja bei CDialog nur
    die Standardmethoden zur Verfügung und nicht die Methoden der Klasse die dem Dialog
    zugeordnet sind.



  • deine GetTab() ist doch schon fast richtig, nur musst du halt die so umbauen das dir der Zeiger von der aktuellen Tab zurückgegeben wird. Diese kennt ja CTabCtrl.

    CDialog* DynTabCtrl::GetActiveTab()
    {
        return m_tabs[GetCurSel()];
    }
    

    So in der Art (hab es nicht getestet und kenn auch deine m_tabs nicht) sollte das zu lösen sein.


Anmelden zum Antworten