Debug Assertion failed - winctrl2.cpp



  • Merc schrieb:

    Gut, ich sehe zwar Fenster A unter Fenster B liegen, aber es existiert angeblich nicht laut Windows (was echt unlogisch ist...).

    Zeig doch mal, wie du versuchst, von B nach A zu kommen. 🙂



  • Merc schrieb:

    WIn Anlehnung an eine andere Datei, welche ich benutze, und wo das Ganze funktioniert, habe ich m_seiteA in der Headerdatei von CSript eingetragen.

    class CScript : public CDialog
    {
    // Construction
    public:
    	CScript(CWnd* pParent = NULL);   // standard constructor
    	
    	PropertyPageSeiteA m_seiteA;
    

    Das ist das Problem. Du erzeugst den Dialog aus einer Instanz deiner Propertypage-Klasse. Der Dialog hat als Member eine weitere Instanz der Propertypage-Klasse. Diese Instanzen haben aber nichts miteinander zu tun. m_seiteA ist nicht deine Propertypage. Das Fenster zu m_seiteA wurde nie erstellt.

    Wenn der Dialog auf die PropertyPage zugreifen muss, musst du ihm einen Zeiger oder eine Referenz auf die richtige Instanz mitgeben.



  • Ah super, MFK hat es schon gefunden. Genau so ein Problem hatte ich vermutet. 🙂



  • D.h. nun was? Sry... das war ne Nummer zu hoch grade 🙂

    Ok, das erzeugen von m_seiteA an dieser Stelle ist falsch, soweit gefressen 🙂 Also m_seiteA wo erzeugen? In CPropertyPageSeiteA selbst und diese dann CSript bekanntmachen? Oder wäre das noch immer falsch? Weil ich kann, zumindest von meinem Verständnis her nicht weiter zurück als dort, oder muss das Ganze sogar noch in CPropertySheet passieren? Oje... Mh... ich versuch mal Try and Error (viel anders kann ichs eh ned 😉 )

    Und weils soviel Arbeit war das Ganze herzurichten, einmal für estartu 😉

    http://www.directupload.net/images/050830/temp/jBp7RVPA.jpg



  • Merc schrieb:

    Also m_seiteA wo erzeugen?

    Gar nicht. Du brauchst keine weitere Instanz der Propertypage-Klasse. Du könntest einfach einen Zeiger draus machen, und diesen beim Erstellen des Dialogs setzen:

    CScript dlgScript;
        dlgScript.m_seiteA = this;
        dlgScript.DoModal();
    


  • Das hier...

    void PropertyPageSeiteA::OnButtonScriphandling() 
    {
    	CScript dlgScript;
    	dlgScript.m_seiteA = this; 
    	dlgScript.DoModal();
    
    }
    

    ...ergibt das hier...

    Compiling...
    PropertyPageSeiteA.cpp
    C:\Program Files\Microsoft Visual Studio\MyProjects\HDTV_MIC\PropertyPageSeiteA.cpp(1375) : warning C4101: 'buffer' : unreferenced local variable
    C:\Program Files\Microsoft Visual Studio\MyProjects\HDTV_MIC\PropertyPageSeiteA.cpp(1637) : warning C4101: 'buffer' : unreferenced local variable
    C:\Program Files\Microsoft Visual Studio\MyProjects\HDTV_MIC\PropertyPageSeiteA.cpp(2291) : error C2039: 'm_seiteA' : is not a member of 'CScript'
    c:\program files\microsoft visual studio\myprojects\hdtv_mic\script.h(15) : see declaration of 'CScript'

    Ich weis... ich bin ne schwere Geburt... Versuche grad mal von Ganz hinten dranzukommen (CPropertySheet). Im schlimmsten Fall wirds gekippt und was anderes versucht. Leider ist die Idee dann aber 100% Userbedienungsfehleranfällig 😉



  • Diese Zeilen sind noch so, wie du sie gepostet hast?

    class CScript : public CDialog
    {
    // Construction
    public:
        CScript(CWnd* pParent = NULL);   // standard constructor
    
        PropertyPageSeiteA m_seiteA;
    


  • Nope, hat ich entfernt, weil mit der Zeile:

    PropertyPageSeiteA m_seiteA;
    

    Kommt dies hier 🙂

    --------------------Configuration: HDTV_MIC - Win32 Debug--------------------
    Compiling...
    PropertyPageSeiteA.cpp
    C:\Program Files\Microsoft Visual Studio\MyProjects\HDTV_MIC\PropertyPageSeiteA.cpp(1375) : warning C4101: 'buffer' : unreferenced local variable
    C:\Program Files\Microsoft Visual Studio\MyProjects\HDTV_MIC\PropertyPageSeiteA.cpp(1637) : warning C4101: 'buffer' : unreferenced local variable
    C:\Program Files\Microsoft Visual Studio\MyProjects\HDTV_MIC\PropertyPageSeiteA.cpp(2291) : error C2582: 'PropertyPageSeiteA' : 'operator =' function is unavailable
    Error executing cl.exe.

    HDTV_MIC.exe - 1 error(s), 2 warning(s)



  • Nicht entfernen, sondern nur eine kleine Änderung an dieser Zeile:

    [cpp]PropertyPageSeiteA* m_seiteA;[/cpp]
    

    (das Sternchen!) und dann müsste es damit

    [cpp]void PropertyPageSeiteA::OnButtonScriphandling() 
    {
        CScript dlgScript;
        dlgScript.m_seiteA = this; 
        dlgScript.DoModal();
    
    } [/cpp]
    

    klappen. 🙂



  • Jopp, das obige kompiliert er anstandslos... nur das m_seiteA nicht der Bedingung für weitere Befehle genügt im Sinne eine Klasse zu sein...

    Glaub ich muss mir was anderes einfallen lassen irgendwie. Naja, hab ja wieder nen ganzen Arbeitstag für, um mir was einfallen zu lassen 😉



  • Na, das sind jetzt aber Grundlagen... 🙄
    Das ist jetzt ein Zeiger, verwende -> statt .



  • Merc schrieb:

    nur das m_seiteA nicht der Bedingung für weitere Befehle genügt im Sinne eine Klasse zu sein...

    Wenn ich deine Interpretation der Fehlermeldung richtig deute, dann musst du nur m_seiteA. durch m_seiteA-> ersetzen.



  • Stimmt, hät ich diesmal drauf kommen müssen... oft genug verwendet... 2 Zeilen darüber z. B. /blush

    Jetzt ihm noch die anderen 10 Seiten unterjubeln und dann kann ich mich Gott sei Dank wieder meinem Lötkolben und Oszi widmen... da hab ich wenigstens nen blassen Schimmer was ich tue...



  • Eine letzte Frage hab ich... könnte mir bitte wer mal das this aufdrösseln? 🙂 Also in ausgeschriebener Form hinschreiben. This ist ja ein Verweis auf sich selbst. Nur wie sieht dieser this Aufruf in Langform aus?



  • Merc schrieb:

    Eine letzte Frage hab ich... könnte mir bitte wer mal das this aufdrösseln? 🙂 Also in ausgeschriebener Form hinschreiben. This ist ja ein Verweis auf sich selbst. Nur wie sieht dieser this Aufruf in Langform aus?

    Was meinst du mit Langform? this ist ein konstanter Zeiger auf die Instanz in einer Instanzmethode (nichtstatische Memberfunktion).



  • void PropertyPageSeiteA::OnButtonScriphandling()
    {
        CScript dlgScript;
        dlgScript.m_seiteA = this;
        dlgScript.DoModal();
    
    }
    

    Durch das this weise ich ja dem m_seitA zu, wohin es zeigen soll. Nun hab ich aber noch 10 weitere Seiten, denen ich Daten zuweisen will. Da ich aber nur aus einer Seite von CPropertyPage den Dialog CSript aufrufe, kann ich ja mit this nur auf eine Seite zurückverweisen.

    Nun versuche ich also die Zeiger auf die existierenden Instanzen m_seiteB bis m_seiteJ ebenfalls zu übergeben. Und das stellt mich halt vor das Probelm, das ich wiedermal ned weis wie... Ja, ich weis, Basiswissen, welches ich aber nicht habe...

    Analog zu dem oben, muss ich ja nun ihm noch erklären, wo er den Rest herbekommt, also:

    dlgScript.m_seiteB = this;
    

    Was natürlich Blödsinn ist, weil ich ja mich im Moment in der Seite A befinde. Also muss die Lösung anders aussehen. (Wieso funzt die Suche nie, wenn man sie zum quoten braucht... GRH)

    PropertyPageSeiteB* m_seiteB= new PropertyPageSeiteB();
    

    Dieser Ansatz fällt ja aus, weil ich ja den Zeiger auf die bestehende Instanz brauche, nicht auf eine hier erzeugte neue.

    Also quasi folgende Form, was so aber nicht korrekt ist. (Fehler C2440)

    dlgScript.m_seiteB = IDD_PROPPAGE2;
    


  • Ah, gefunden, was ich gesucht hab... in einem anderen Beitrag ist noch dies hier vermerkt:

    CModelldesignerView* pMDView = (CModelldesignerView*)this->GetActiveView();
    

    Wenn ich versuche das zu machen, hab ich wieder das Problem von this. In der kommenden Fehlermeldung verweist er a) auf PropertyPageSeiteA und b) darauf, das GetActiveView nicht existiert. 😎 lässt sich ja erklären, weil eine Funktion, die nicht enthalten ist, kann ich nunmal nicht verwenden. Nur ist a) dann wieder das Problem, weil ich ja auf PropertyPageSeiteB zugreifen will.

    --------------------Configuration: HDTV_MIC - Win32 Debug--------------------
    Compiling...
    PropertyPageSeiteA.cpp
    C:\Program Files\Microsoft Visual Studio\MyProjects\HDTV_MIC\PropertyPageSeiteA.cpp(1378) : warning C4101: 'buffer' : unreferenced local variable
    C:\Program Files\Microsoft Visual Studio\MyProjects\HDTV_MIC\PropertyPageSeiteA.cpp(1640) : warning C4101: 'buffer' : unreferenced local variable
    C:\Program Files\Microsoft Visual Studio\MyProjects\HDTV_MIC\PropertyPageSeiteA.cpp(2292) : error C2039: 'GetActiveView' : is not a member of 'PropertyPageSeiteA'
    c:\program files\microsoft visual studio\myprojects\hdtv_mic\propertypageseitea.h(14) : see declaration of 'PropertyPageSeiteA'



  • Von wo werden die Seiten den erstellt? Ich denke, dort musst du ansetzen. 🙂



  • Die Seiten werden noch nen Dialog tiefer erstellt halt 😉 Ist ja nunmal ne Dialogbasierende Anwendung. Sekunde...

    void CHDTV_MICDlg::OnButtonStart() 
    {
    	PropertyPageSeiteA propertyPageSeiteA;
    	PropertyPageSeiteB propertyPageSeiteB;
    	PropertyPageSeiteC propertyPageSeiteC;
    	PropertyPageSeiteD propertyPageSeiteD;
    	PropertyPageSeiteE propertyPageSeiteE;
    	PropertyPageSeiteF propertyPageSeiteF;
    	PropertyPageSeiteG propertyPageSeiteG;
    	PropertyPageSeiteH propertyPageSeiteH;
    	PropertyPageSeiteI propertyPageSeiteI;
    	PorpertyPageSeiteJ propertyPageSeiteJ;
    	PropertyPageSeiteK propertyPageSeiteK;
    
    	CMyPropSheet propertySheet("Titel", this);
    	propertySheet.AddPage(&propertyPageSeiteA);
    	propertySheet.AddPage(&propertyPageSeiteB);
    	propertySheet.AddPage(&propertyPageSeiteC);
    	propertySheet.AddPage(&propertyPageSeiteD);
    	propertySheet.AddPage(&propertyPageSeiteE);
    	propertySheet.AddPage(&propertyPageSeiteF);
    	propertySheet.AddPage(&propertyPageSeiteG);
    	propertySheet.AddPage(&propertyPageSeiteH);
    	propertySheet.AddPage(&propertyPageSeiteI);
    	propertySheet.AddPage(&propertyPageSeiteJ);
    	propertySheet.AddPage(&propertyPageSeiteK);
    
    	propertySheet.DoModal();
    }
    

    Am schönsten wärs wahrscheinlich, ich käme an das CPropertySheet ran, von da müsste ich ja an dessen Seiten kommen.



  • Ist das zufällig der Hauptdialog? Dann wäre es nämlich deutlich einfacher als sonst. 😃
    Denn da ich leider nicht weiß, ob das PropertySheet seine Seiten kennt und umgekehrt, müsste man da tricksen. 🙄


Anmelden zum Antworten