Debug Assertion failed - winctrl2.cpp



  • Wollen wir mal... zuerst estartu

    BOOL CListCtrl::SetItemText(int nItem, int nSubItem, LPCTSTR lpszText)
    {
    ASSERT(::IsWindow(m_hWnd));
    ASSERT((GetStyle() & LVS_OWNERDATA)==0);
    LVITEM lvi;
    lvi.iSubItem = nSubItem;
    lvi.pszText = (LPTSTR) lpszText;
    return (BOOL) ::SendMessage(m_hWnd, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi);
    }

    Der Pfeil steht auf dem ersten Assert. Ich hoffe, das war, was du meintest...

    Und nun zu MFK. Die Frage kann ich dir nedmal beantworten 🙂 Ich glaube es aber nicht so wirklich... aber ok, es handelt sich um Windowsprogrammierung, dem trau ich alles zu 🙂

    Ich kürze den Code mal etwas, weil ich glaub, das der Teil davor irrelevant ist. Zu Testzwecken habe ich die Zeile aus dem langen Codeteil in den else-Fall verschoben, welcher auf einen Buttondruck sofort greift.

    void CScript::OnButtonTransmit() 
    {
       if (Bedingung)
       {}
       else
       {
       m_seiteA.m_liste.SetItemText(0, 3, "FF");
       }
    }
    

    Das Ganze steht im .cpp File das Dialoges script.cpp, welcher aus dem Dialog CPropertyPageSeiteA aufgerufen wird, wo die CListCtrl beim InitDialog mit Daten gefüllt wird.

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

    Die Variable m_liste hat Visual Studio selbst erstellt in der Headerdatei von PropertyPageSeiteA.

    class PropertyPageSeiteA : public CPropertyPage
    {
    	DECLARE_DYNCREATE(PropertyPageSeiteA)
    
    // Construction
    public:
    	PropertyPageSeiteA();
    	~PropertyPageSeiteA();
    
    // Dialog Data
    	//{{AFX_DATA(PropertyPageSeiteA)
    	enum { IDD = IDD_PROPPAGE_PropertySheetSeite1 };
    	CEdit	m_buddy;
    	CSpinButtonCtrl	m_spin;
    	CListCtrl	m_liste;
    	CString	m_edit7;
    	CString	m_slaveadr;
    	CString	m_hex;
    	CString	m_data;
    	CString	m_data2write;
    	//}}AFX_DATA
    

    In 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;
    

    Zum Vergleich der Code meiner Datei, an die ich mich anlehne:

    class CCommDlg : public CDialog
    {
    // Construction
    public:
    	CCommDlg(CWnd* pParent = NULL);   // standard constructor
    	CClock<CCommDlg> myClock;
    
    	CMSComm m_mscomm;
    

    Einziger Unterschied ist, dass ich oben NICHT CPropertyPageSeiteA schreiben kann, sondern nur PropertyPageSeiteA, weil er mir sonst nen Fehler produziert beim Compilier.

    [/quote]--------------------Configuration: HDTV_MIC - Win32 Debug--------------------
    Compiling...
    PropertyPageSeiteA.cpp
    c:\program files\microsoft visual studio\myprojects\hdtv_mic\script.h(32) : error C2146: syntax error : missing ';' before identifier 'm_seiteA'
    c:\program files\microsoft visual studio\myprojects\hdtv_mic\script.h(32) : error C2501: 'CPropertyPageSeiteA' : missing storage-class or type specifiers
    c:\program files\microsoft visual studio\myprojects\hdtv_mic\script.h(32) : error C2501: 'm_seiteA' : missing storage-class or type specifiers
    Generating Code...
    Compiling...
    Script.cpp
    c:\program files\microsoft visual studio\myprojects\hdtv_mic\script.h(32) : error C2146: syntax error : missing ';' before identifier 'm_seiteA'
    c:\program files\microsoft visual studio\myprojects\hdtv_mic\script.h(32) : error C2501: 'CPropertyPageSeiteA' : missing storage-class or type specifiers
    c:\program files\microsoft visual studio\myprojects\hdtv_mic\script.h(32) : error C2501: 'm_seiteA' : missing storage-class or type specifiers
    C:\Program Files\Microsoft Visual Studio\MyProjects\HDTV_MIC\Script.cpp(340) : error C2065: 'm_seiteA' : undeclared identifier
    C:\Program Files\Microsoft Visual Studio\MyProjects\HDTV_MIC\Script.cpp(340) : error C2228: left of '.m_liste' must have class/struct/union type
    C:\Program Files\Microsoft Visual Studio\MyProjects\HDTV_MIC\Script.cpp(340) : error C2228: left of '.SetItemText' must have class/struct/union type
    Generating Code...
    Error executing cl.exe.

    HDTV_MIC.exe - 9 error(s), 0 warning(s)[quote]

    Mein persönlicher Verdacht liegt genau in diesem Fehler, den er dort produziert 🙂 Hatte gehofft jemand hätte sofort ne andere Idee, wie man sowas realisiert, aber nun muss dem Ganzen wohl auf den grund gegangen werden... dummerweise 😉

    Danke schonmal.



  • Denk doch mal kurz über diese Zeilen nach:

    BOOL CListCtrl::SetItemText(int nItem, int nSubItem, LPCTSTR lpszText)
    {
    ASSERT(::IsWindow(m_hWnd));
    

    Es geht um ein ListCtrl. Da soll ein ItemText festgelegt werden.
    Jetzt wird gemeckert, dass das gar kein Fenster ist - also, dass das Fenster noch nicht exisitert ➡ MFK hat Recht.

    Und? Ist doch gar nicht schwer gewesen, bis hierher, oder? 😉

    Dieser Fehler tritt meistens auf, wenn du versuchst, sowas vor OnInitDialog zu machen - passt das?



  • Ok, also exixtiert das Fenster nicht... jetzt hab ich nen logisches Problem...

    Ich öffne aus Fenster A das Fenster B, tue in Fenster B etwas, kann aber nicht in Fenster A aus dem Fenster B zurückschreiben... ist das soweit korrekt?

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

    Wie bekomme ich nun Auf schliessen des Fensters B Daten aus dem Fenster B in Fenster A, ohen mich zu verbiegen? 🙂



  • 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'


Anmelden zum Antworten