Absturz wenn Fremde Klasse Aufruf erzeugt



  • Mich plagt jetzt schon ein paar Stunden die Klasse eines nicht modalen
    Dialoges.

    Dort wird eine Funktion des Hauptdialoges gerufen, welche bei

    GetDlgItem(IDC_BUTTON8)->EnableWindow(true);
    

    fehlschlägt.

    Es ist immer dann der Fall, wenn aus dem nicht modalen Dialog gerufen wird.
    Das Programm schmiert ab und im Debugger lande ich in der winocc.cpp an
    dieser Stelle:

    BOOL CWnd::EnableWindow(BOOL bEnable)
    {
    	ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));
    
     :arrow_right: 	if (m_pCtrlSite == NULL)
    		return ::EnableWindow(m_hWnd, bEnable);
    	else
    		return m_pCtrlSite->EnableWindow(bEnable);
    }
    

    Der Aufruf erfolgt so aus dem nicht modalen Dialog:

    CString h ="123";
    CTestDlg zug;
    zug.dropperpfad(h);
    

    In der Hauptanwendung ist die Funktion so angelegt:

    void CTestDlg::dropperpfad(CString d_listpfad)
    {
    GetDlgItem(IDC_BUTTON8)->EnableWindow(true);
    }
    

    IDC_BUTTON8 existiert und ist inaktiv gesetzt.

    Der Aufruf aus der Hauptanwendung bringt keine Probleme.



  • Du erstellst eine neue Klasseninstanz des Dialogs und da existiert eben kein Fenster und auch keine Controls.
    Wenn du auf den Vorhanden Dialog zugreifen willst muss du die vorhanden Klasseninstanz nehmen.
    Übergib den this an dem modlessdialog ider eben eine zeiger auf das Control.



  • Hallo Unix-Tom,

    meinst du ich soll statt der Dlg-Klasse einfach folgendes verwenden?

    [cpp]CString h ="123";
    CTest zug;
    zug.dropperpfad(h);[/cpp]

    Ich hoffe ich stelle mich nicht allzu blöde an, wo das doch
    ganz sicher zu den Basics gehört 🙄



  • Ok, dieser ominöse this-Zeiger ist wohl der Knackpunkt?!

    Kann mir bitte jemand sagen wie man damit in diesem Fall arbeitet?



  • Hmm,..ich mache es doch eigentlich genauso wie hier auch
    beschrieben...??

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-169814-and-highlight-is-dialog+funktion.html

    I need some correction if i am that wrong please 😃



  • Ich denke das Dir hier die Grundlagen fehlen und es würde zu weit führen dir diese beizubringen.
    Als Ansatz:
    this ist ein zeiger auf seine eigene Klasse (Man möge mir verzeihen das ich keine Fachbegriffe verwendet habe)

    Wenn du eine anderen Dialog erstellst kannst du diesem den this-Zeiger übergeben und kannst dann vom anderen Dialog (Klasse) mittels dem thiszeiger auf die andere Klasse zugreifen.
    Dies ist aber nur ene von vielen Möglichkeiten und sicher nicht die schönste.
    Es würde z.B. auch mit eine Message gehen.
    Aber wie gesagt fehlen dir dazu die Grundlagen.



  • Hmm, verstehen würde ich das schon gerne.

    Wenn:

    int x = 10;
    

    dann ist das doch identisch mit

    this->x=10;
    

    oder

    (*this).x=10;
    

    Das ist etwas was ich inzwischen bereits versucht habe.
    Ich hoffe richtig...

    this->GetDlgItem(IDC_EDIT1)->SetWindowText(x);
    

    Der Fehler bleibt jedoch der gleiche = Absturz.

    Ich wäre dir dankbar, wenn du mir dennoch helfen könntest.
    Es ist ja nicht so, dass ich daraus nichts lernen könnte, oder wollte.

    Gruß
    Kunibert



  • du kannst nicht einfach von deinem 2ten dialog per this auf den ersten zugreifen.
    du übergibst eine zeiger auf den dialog.
    schau mal in die FAQ. Da habe ich vor jahren mal eine Code gepostet der eine this an einen Thread übergibt.
    Diese Arbeit solltest dir die Lösung schon wert sein.



  • Ich habe die 6 Seiten FAQ durchwühlt, aber bin mir nicht sicher wie
    ich da nun wirklich vorgehe (ganz ehrlich).

    CString h ="c:\\test"; 
    
    CTestDlg* xg = NULL;
    xg = new CTestDlg(this); // du meinst diesen Part oder?
    xg->dropperpfad(h);
    

    Ich vermute da, dies auch falsch ist, dass es mir auch niemand weiter
    versuchen wird beizubringen, was ich verstehen kann, aber schade finde.

    Ich halte mich an google und versuche weiter mein Glück 😡
    Sollte ich die Lösung noch finden poste ich hier, damit irgendwann mal
    jemand, der auch so frishc dabei ist wie ich, sich die Arbeit nicht nochmal machen muss!



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-39101.html

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39041.html

    Auch wenn es um Threads geht aber der Klasse welche von CWinTrhread abgeleitet ist wird der this des Dialogs übergeben.



  • Ich habe es doch m.E. schon so gemacht:

    1. include der Hauptklasse in die neue Klasse des Unterdialoges.
    2. Zeiger auf Hauptklasse:

    CHauptklasse* p_x;
    

    3. Aufruf einer Funktion des Hauptdialoges über deren Zeiger

    p_x->Funktion(x);
    

    In dem Beispiel wird ja noch zuvor SetOwner gerufen. Da ich aus dem Unterdialog
    den Hauptdialog aufrufe vermute ich mal ich muss hier nicht mit

    p_x->SetOwner(this),
    

    sondern sowas wie

    p_x->SetOwner(GetParent());
    

    verwenden ?

    Dennoch ist im Hauptdialog (wo ich auch ankomme in der Funktion), der
    Fehler, dass er bei Zugriff auf Steuerelemente des selben, abstürzt.

    Aber die Funktion ist doch schon im Hauptdialog angekommen und die Funktion
    auch Teil dessen:

    CHauptdialogDlg::Funktionxy(CString x);
    

    Ich gebe mir wirklich mühe das zu verstehen 😡



  • ich denke SendMessage(..) wird mich da wohl ebenso ans Ziel bringen 👎



  • Ist denn p_x auch Initialisiert?



  • 😕 Ich bin mir nicht sicher was du meinst.
    Ich denke der Zeiger auf die Hauptklasse reicht aus?



  • im "ten Dialog muss du eine Funktion setowner (name egal) haben. In der Klasse des 2ten Dlg braucht du auch
    CHauptklasse* p_x;

    In der Funktion setowner

    p_x = pOwner;

    Nun kannst du im 2ten Dialog auf die Klasse des Hauptdialogs zugreifen mit

    p_x->wasauchimmer()


Anmelden zum Antworten