Fehler beim includieren der View Klasse



  • ja die debug sachen hab ich in beiden cpp dateien also in der ProgrammView.cpp und in der Anzeige.cpp.
    das idd_programm_form ist mein "hauptfenster" und ist generiert. normalerweise bekomme ich auch keine fehlermeldung sondern erst wenn ich die programmview versuche irgendwo zu includieren. ich brauchs nu in der CAnzeige, aber ich bekomm die selbe fehlermeldung auch bei anderen klassen, nur manchmal sind es alle 5 und manchmal nur die letzten drei beim "CProgrammDoc* GetDocument();". hab es auch mal mit anderen klassen versucht.

    Jens



  • Ups

    das müsste natürlich am Anfang heissen:

    class CProgrammDoc;





  • jensemann_79 schrieb:

    das class CDocument; in der anzeige.h hat nichts geholfen, keine veränderung auch wenn ichs weglasse.

    Versuch es doch mal mit

    class CProgrammDoc;
    

    denn die wird ja schliesslich als unbekannt bemeckert.



  • ja das hat geklappt, die fehlermeldungen sind weg.
    vielen dank! 😃 👍
    ich kann immernoch nicht auf mein Listenelement zugreifen, da stürzt das programm glatt ab.

    CAnzeige::Spalte(void)
    {
            CListCtrl *pListCtrl = (CListCtrl*) GetDlgItem(IDC_LIST1);
            pListCtrl->SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_INFOTIP); 
    
    ...
    }
    

    jetzt sagt er mir das GetDlgItem keine 1 parameter akzeptiert. ich weiss das hinter IDC_LIST1 noch etwas hin muss, ein pointer der auf mein fenster zeigt, oder? aber ich weiss nicht weiter.

    Jens



  • DAVOR muss ein Handle des Views.

    HWND GetDlgItem(
    HWND hDlg, // handle to dialog box
    int nIDDlgItem // control identifier
    );

    Hast du keine MSDN? 😕

    Für den Fall, das:
    Ich bin mir ziemlich sicher, das HWND von einem CWnd ist CWnd::m_hWnd. Ansonsten lass dir den Zeiger auf die Liste doch von deinem View geben, der kann das besser. (Und du brauchst nur noch einen Parameter 😉 )

    Bis bald



  • guten morgen!

    ja hast recht kommt davor, hab mich vertan, aber ich sitze seit gestern und es klappt nicht.
    den code hab ich in meiner view-klasse:

    MyhWnd=CWnd::m_hWnd;        // oder MyhWnd=CFormView::m_hWnd; kommt aufs selbe
    	m_CAnzeige.Spalte(MyhWnd);
    

    diesen code hab ich in meiner Anzeige-Klasse:

    CAnzeige::Spalte(HWND MyhWnd)
    {
    	CListCtrl *pListCtrl = (CListCtrl*) GetDlgItem(MyhWnd,IDC_LIST1);
    	pListCtrl->SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_INFOTIP); //<-- Hier stürzt er ab
    }
    

    beim debugen wird das handle richtig übergeben, bin mir aber nicht sicher ob es überhaupt das handle ist was GetDlgItem von mir verlangt.
    der zeiger wird auch noch richtig initialisiert, obwohl im debug an manchen positionen mit roten fragezeichen stehen: {CListCtrl hWnd=???}.
    vielleicht könntet ihr mir noch nen tip geben.
    vielen dank!

    Jens

    ps.: ich hab die msdn, hab jedoch leider noch nie vorher mit handles zu tun gehabt.



  • Ok, so hatte ich das nicht gemeint.

    Du sollst nicht

    MyhWnd=CWnd::m_hWnd;
    

    schreiben, sondern die Membervariable m_hWnd DEINES Views da rein stecken.

    Also:

    void CDerView::IrgendeineFunktion()
    {
        m_CAnzeige.Spalte(m_hWnd);
    }
    

    Einfacher wäre es, gleich das Control zu übergeben:

    void CDerView::IrgendeineFunktion()
    {
        Spalte(GetDlgItem(IDC_LIST1));
    }
    
    CAnzeige::Spalte(CListCtrl* pCtrl)
    {
        ASSERT(pCtrl); // Ist der Zeiger OK?
        if (pCtrl)
        {
            pCtrl->SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_INFOTIP); 
        }
    }
    

    So in der Art.

    Hoffe, das war verständlich - sonst bis später 😉



  • leider funktionitert keine der beiden varianten richtig. 😞 woran kann es liegen?

    1. variante:

    view-klasse:

    void CProgrammView::OnInitialUpdate()
    {
    	CFormView::OnInitialUpdate();
    	GetParentFrame()->RecalcLayout();
    	ResizeParentToFit();
    	m_CAnzeige.Spalte(m_hWnd);
    }
    

    anzeige-klasse:

    void CAnzeige::Spalte(HWND MyhWnd)
    {
    	CListCtrl *pListCtrl = (CListCtrl*) GetDlgItem(MyhWnd,IDC_LIST1); 
    	pListCtrl->SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_INFOTIP); 
    }
    

    dabei gibt er hier einen debug assertion failure in der datei: AFXCMN.H, aber beim debuggen stehen keine fragezeichen mehr.

    2.Variante (die mir persönlich auch besser gefallen hätte):

    View-Klasse:

    void CProgrammView::OnInitialUpdate()
    {
    	CFormView::OnInitialUpdate();
    	GetParentFrame()->RecalcLayout();
    	ResizeParentToFit();
    	m_CAnzeige.Spalte(GetDlgItem(IDC_LIST1));
    }
    

    Anzeige-Klasse:

    void CAnzeige::Spalte(CListCtrl* pCtrl)
    {
    	ASSERT(pCtrl); // Ist der Zeiger OK? 
        if (pCtrl) 
        { 
            pCtrl->SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_INFOTIP);  
        } 
    }
    

    dabei bekomme ich folgende fehlermeldung: "error C2664: 'Spalte' : Konvertierung des Parameters 1 von 'class CWnd *' in 'class CListCtrl *' nicht moeglich
    Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat"

    eine oder mehr ideen? 🙂

    Jens



  • Tschuldigung, ich habe in dem Beispiel einen Cast vergessen - *schäm*

    void CProgrammView::OnInitialUpdate() 
    { 
        CFormView::OnInitialUpdate(); 
        GetParentFrame()->RecalcLayout(); 
        ResizeParentToFit(); 
        CListCtrl* pCtrl = dynamic_cast<CListCtrl*>(GetDlgItem(IDC_LIST1));
        m_CAnzeige.Spalte(pCtrl); 
    }
    

    Vorsicht, wieder nicht getestet, aber ich bin mir fast sicher.
    Zur Not nimm einen normalen C-Cast, den mag ich blos nicht so gern.



  • [quote]

    void CProgrammView::OnInitialUpdate() 
    { 
        CFormView::OnInitialUpdate(); 
        GetParentFrame()->RecalcLayout(); 
        ResizeParentToFit(); 
        m_CAnzeige.Spalte(GetDlgItem(IDC_LIST1)); 
    }
    

    Machs doch so:

    void CProgrammView::OnInitialUpdate() 
    { 
        CFormView::OnInitialUpdate(); 
        GetParentFrame()->RecalcLayout(); 
        ResizeParentToFit(); 
        m_CAnzeige.Spalte( &m_CListCtrl); 
    }
    


  • es funktioniert 😃 !
    vielen dank! (was hätt ich ohne euch gemacht 😕 )
    hab der einfachheithalber die lösung von rene genommen. bei gelegenheit werd ich den anderen code aber auch noch ausprobieren.
    na dann danke nochmal!!

    Jens



  • ich bin schon wieder am verzweifeln.
    muss jetzt meine funktion spalte(CListCtrl *pCtrl) zusätzlich von einer OnOk funktion eines dialogs ausführen. jedoch kann ich ja von dort nicht die &m_CListCtrl übergeben.
    wie könnte ich das bewerkstelligen?

    der dialog wird in einer funktion der CMainFrame aufgerufen mit domodal.

    Jens



  • 😕 Noch mal langsam bitte:

    In welcher Klasse ist das Listcrtl?

    Warum brauchst du die Funktion in OnOK? (Vielleicht kannst du sie ja danach aufrufen, in CMainFrame...)

    Stell uns doch mal ausgewählte Stückchen Quellcode zur Verfügung, dann muss man nicht so raten.

    Erkläre, was genau du erreichen willst, bin etwas ratlos. 😞



  • ich hab das problem mittlerweile in einer schlaflosen nacht gelöst.
    vorher:
    -das ClistCtrl ist in der View-Klasse
    -der Aufruf (ein button in der menüleiste) zu einem Dialog in der CMainFrame
    -bei ok-klicken im dialog sollte die funktion spalte aufgerufen werden, welche allerdings wieder die adresse von m_CListCtrl bräuchte

    jetzt:
    -CListCtrl ist immernoch in der View-Klasse
    -der dialog aufruf ist jetzt aber auch in der viewklasse (wusste nicht das das geht, hab es aber in einem früheren projekt auch schonmal gemacht, man muss halt nur den klassenassistent bedienen können)
    -hab die abfrage ob der dialog mit ok beendet wurde auch in der view-klasse gemacht und nicht mehr in der onok-funktion und von dadurch kann ich auch wieder die adresse von m_CListCtrl übergeben

    verstanden? bin schon nen bischen stolz auf mich, muss mich aber trotzdem bedanken das du dich dem problem wieder angenommen hättest.

    na dann...

    Jens


Anmelden zum Antworten