Aus 1.Dialog eine Combobox des 2.Dialogs füllen



  • hallo,

    ich möchte aus einem dialog heraus, die combobox eines anderen dialoges füllen

    void CDlgtesterDlg::OnBnStart() 
    {
    	UpdateData(true);
    	Dialog2 dlg;
    	dlg.m_combo="test";
    	dlg.m_combo_control.AddString("test");
    	dlg.m_combo_control.AddString("test2");
    	dlg.DoModal();
    
    }
    

    den Cstring überträgt er problemlos. nur mit der addstring funktion gibts probleme. und ich bekomme eine fehlermeldung sobald er diese funktion ausführen will.
    Kann es vielleicht daran liegen, dass die combobox noch nicht existiert zu dem zeitpunkt? wie kann ich das problem umgehen?

    mfg, TFTS



  • TFTomSun schrieb:

    Kann es vielleicht daran liegen, dass die combobox noch nicht existiert zu dem zeitpunkt?

    definitiv!

    Umgehen kannst du dieses Problem, indem du den Dialog Non-Modal machst.

    CDialog2 *dlg2;
    dlg2 = new CDialog2();
    dlg2->Create(IDD_DESDIALOGES, NULL);
    

    anzeigen:

    dlg2->ShowWindow(SW_SHOW);
    

    nach dem Createn kannst du dann auch die Combobox füllen...

    Viel Spaß! 😃



  • hmm jetz geht zwar das addstring setzen, aber dafür kann ich nicht mehr die CString Membervariable der Combobox von der einen Dialogklasse in die andere übertragen. wie muss ich das jetzt anstellen? dlg.m_combo=m_combo funktioniert nicht mehr... ist ja auch völlig klar da dlg jetzt ein pointer ist. wenn ich aber jetzt noch eine zusätzliche variable der klasse CDialog2 erstelle geht der selbe konstrukt trotzdem nicht.

    Bitte um hilfe 🙂 danke!

    mfg, TFTS



  • dlg->m_combo="test";
    dlg->UpdateData(false);
    


  • perfekt, jetz muss ich nur noch wissen, wie ich komplette Felder rüber bekomme... aber ich versuchs erstmal selber. melde mich wenn ich zu dämlich dafür bin

    danke!

    mfg, TFTS



  • ok ich packs nich. alle varianten die ich per suche gefunden hab, scheinen mir zu kompliziert zu sein. ich will einfach nur mein array in der anderen klasse bekannt machen... sei es durch kopieren,per pointer oder sonste wie...
    zusätzlich muss noch die möglichkeit bestehen, dass ich in der 2.dialog klasse einzelne elemente des arrays ändern kann und das natürlich dann auswirkungen auf den array des 1.dialogs hat.

    mfg, TFTS



  • bin mir jetzt nicht ganz sicher welches problem du hast, aber es geht so:

    1. dein erstes dialogfeld wird initialisiert und angezeigt.
    2. durch eine aktion (z.b. button drücken) soll dein zweites dialogfeld aufgerufen werden. das machst du so:
    C2Dlg.DoModal();
    3. In der OnInitDlg() grifst du auf public attribute oder funktionen des ersten dialogfeldes zu. das geht mit:

    ((C1Dlg()GetParent())->Funktion1();
    

    du musst natürlich die dialogfeld-header deines ersten dialogfeldes in dein zweites includen.

    so gehts bei mir, schätze dann auch bei dir ;):D

    EDIT:
    Meinte oben natürlich OnInitDialog() !! sorry



  • wie aber muhkuh schon geschrieben hat. damit ich im 1.dialog funktionen des 2. dialogs aufrufen kann muss ich den 2. dialog nonmodal öffnen.
    Ich vermute mal, dass deine variante unter diesem aspekt nicht mehr funktionieren wird zumal dein post auch leicht am thema vorbei war. ich möchte gern im 2. dialog ein array erzeugen, dass den selben inhalt wie das array im ersten dialog hat bzw. ich möchte im 2. dialog zugriffe auf das array im 1.dialog haben. ich seh nicht ganz wo du das thema array behandelst

    mfg, TFTS



  • TFTomSun schrieb:

    ok ich packs nich. alle varianten die ich per suche gefunden hab, scheinen mir zu kompliziert zu sein. ich will einfach nur mein array in der anderen klasse bekannt machen... sei es durch kopieren,per pointer oder sonste wie...
    zusätzlich muss noch die möglichkeit bestehen, dass ich in der 2.dialog klasse einzelne elemente des arrays ändern kann und das natürlich dann auswirkungen auf den array des 1.dialogs hat.

    mfg, TFTS

    <yoda>
    Einen Zeiger auf das Feld dem 2. Dialog übergeben du musst! Bearbeiten du dieses Feld im 2. Dialog dann kannst.
    </yoda>



  • probier mal das oder ähnliches, sollte funzen !

    bool ErsterDialog::GetString(CString& str)
    {
        static int nCounter=0;
        nCounter++;
        switch(nCounter)
        {
        case 1:  str="Bla";
                 return true;
        case 2:  str="furz";
                 return true;
        default: nCounter=0;
                 return false;
        }
    }
    
    BOOL ZweiterDialog::OnInitDialog()
    {
        CDialog::OnInitDialog();
        // hier iss noch dein code !
        CString str;
        while(((ErsterDialog*)GetParent())->GetString(str))
        {
            m_combo_control.AddString(str);
        }
    }
    


  • was vergessen hab !

    void ErsterDialog::Irgendwo()
    {
        ZweiterDialog dlg;
        dlg.DoModal();
    }
    


  • @nonamebody mir gehts um ein array. bei einer normalen variable hab ich keine probleme die zu übertragen.

    @muhkuh welchen typs muss der zeiger sein? wie sag ich dem zeiger dass er auf mein array zeigt. wie kann ich in der 2.dialog klasse dann über den zeigen wieder die einzelnen elemente bearbeiten... und überhaupt und wie soll das gehen?



  • Kannst ja ähnlich machen, du weisst doch die anzahl deiner arrayelemente oder ?

    bool ErsterDialog::GetString(CString& str)
    {
        // nNumberOfEntries = ANzahl der Arrayelemente
        // astrEntries = CString Array
        static int nCounter=0;
        if(nCounter<nNumberOfEntries)
        {
           str=m_astrEntries[nCounter];
           return true;
        }
       else
        {
           nCounter=0;
           return false;
        }
    }
    

    Falls es sich um ein CString Array handelt, kannste ja mal die CStringList versuchen !



  • ich will aber nicht jedes einzelne element rüber schicken sondern mit einem schlag sagen können Dialog2Array=Dialog1Array oder im 2.dialog sagen können Dialog1Array[5]="lala"

    mfg, TFTS



  • wie kann ich eine combobox füllen/reseten, wenn der dialog schon existiert?

    dlg->m_combo_control.ResetContent(); funktioniert da nicht



  • Du musst natürlich nachdem du die Combobox geleert hast, die Oberfläche auch wieder updaten!

    die Zauberformel:

    dlg->UpdateData(false);
    


  • nein, das problem ist ja, dass es eine fehlermeldung gibt bei dem ausführen der zeile

    ich vermute ich darf das fenster vorher nicht mit

    dlg->Create(IDD_LAGER_DIALOG, NULL);
    

    initialisieren. Bloß wie mach ich das dann?
    es müsste dann sicherlich sowas ähnliches wie

    dlg->SwitchTo(IDD_LAGER_DIALOG,NULL);
    

    sein

    muss ich die dlg variable trotzdem mit

    dlg = new CLagerDlg();
    

    initialisieren?

    mfg, TFTS



  • du musst das Fenster mit Create initialisieren

    dein Fehler liegt dann irgenwo anders...

    sag doch mal, wo du die Combobox "resetten" willst und poste wie du das machst...
    bissl mehr Code musst du schon preisgeben!

    Übrigens: welche Fehlermeldung gibt es denn? Das könnte schon helfen....

    EDIT:

    dlg->SwitchTo(IDD_LAGER_DIALOG,NULL);
    

    hä? 😕 Was er machen will?



  • ok jetzt mal ganz im detail
    ich habe hier meinen alten dialog (das ist also der dialog der beim starten des programms aufgerufen wird)
    aus einem neuen dialog heraus, will ich eine combobox des alten dialogs reseten

    CLagerDlg *dlg;
    dlg = new CLagerDlg();
    	dlg->Create(IDD_LAGER_DIALOG, NULL); 
    
    	dlg->ProgrammordnerZuArbeitsordner();
    
    //Variableninitialisierung	
    	Firmennr=-1;
    	Spaltennr=0;
    	dlg->Trennzeichen=Trennzeichen;
    	dlg->empty=empty;
    
    	dlg->m_herstellerfilter_control.ResetContent();
    	dlg->m_vherstellerfilter_control.ResetContent();
    	m_ansprechpartner_control.ResetContent();
    	m_firmenname_control.ResetContent();
    	dlg->m_hersteller_control.ResetContent();
    	dlg->m_lieferant1_control.ResetContent();
    	dlg->m_lieferant2_control.ResetContent();
    

    das ist der code...
    durch eine MesssageBox beim Start meines alten dialoges weiss ich, dass das programm nun versucht den alten dialog neu zu erstellen, was natürlich schwachsinn ist, da dieser dialog schon erstellt ist (er ist ja nur im hintergrund) als fehlermeldung bekomm ich dann folgendes:

    Unbehandelte Ausnahme in Lager.exe! Stack overflow!

    ich hoffe das hilft dir etwas.

    noch was, ich bin mir ziemlich sicher, dass diese create fkt an dieser stelle falsch sein muss. ich will ja den dialog nicht neu erstellen sondern nur bearbeiten > er existiert ja schon

    mfg, TFTS



  • *lala*



  • wahh ich habs... nix mit neu createn

    ((CLagerDlg*) GetParent())->m_herstellerfilter_control.ResetContent();
    

    das ist die zauberformel... jetz muss ich bloß noch testen, ob ich damit auch funktionen aufrufen und variablen schreiben/lesen kann.

    mfg, TFTS


Anmelden zum Antworten