CSplitterWnd Daten nach anderer Klasse übergeben



  • Tjo heißt ja auch Doc/View Architecture...

    d.h.

    #include ".\cmcheckdoc.h"
    #include ".\cmcheckview.h"
    

    Achja...McSnoop.. lern mal die Grundlagen von C++ 😉 Nen SourceFile zu includieren haut net hin 😃



  • Hallo,
    jetzt habe ich die Dateien:
    #include ".\CMCheckdoc.h"
    #include ".\CMCheckView.h"
    eingebunden.

    nun versuche ich mit:
    CMCheckView* myView;
    myView->GetListCtrl().InsertItem(0,"Hallo",1);

    die CListCrtl - Klasse zum Ausgeben des Wortes Hallo zu zwingen, bekomme aber immer noch diese Fehler Meldungen:

    error C2027: Verwendung des undefinierten Typs "CMCheckView"
    Siehe Deklaration von 'CMCheckView'
    error C2227: Der linke Teil von '->GetListCtrl' muss auf Klasse/Struktur/Union zeigen
    error C2228: Der linke Teil von '.InsertItem' muss eine Klasse/Struktur/Union sein

    Kann mir jetzt noch jemand helfen 😞

    Mfg Anlen



  • Sagt er denn das er die Header nicht findet?

    Normal lässt der, solange du die Klasse vom Assistenten hinzufügen lassen hast, das "C" am Anfang eines Dateinamens weg... dann wäre das:

    #include ".\mcheckdoc.h"
    #include ".\mcheckview.h"
    

    Andern Falls kann ich mir das mit dem von dir gezeigten Code nicht erklären... müsste dann wissen aus welcher Klasse du darauf zugreifst usw...



  • (D)Evil schrieb:

    Tjo heißt ja auch Doc/View Architecture...

    d.h.

    #include ".\cmcheckdoc.h"
    #include ".\cmcheckview.h"
    

    Achja...McSnoop.. lern mal die Grundlagen von C++ 😉 Nen SourceFile zu includieren haut net hin 😃

    jo is natürlich richtig. ^^ Da kann man mal sehen das selbst bei so wenig post inhalt sich noch fehler einschleichen können bei zu hohem Melatoninspiegel. 😃



  • Hallo,

    der Compiler meckert nicht, das er die Header Dateien nicht findet.

    Ich habe mit dem VC Assisteten eine eine SplitWindow Applikation erstellt.
    Die linke Klasse ist ja normalerweise ein CTreeCtrl, die rechte eine CListCtrl Klasse.
    Da ich die CTreeCtrl nicht benötige habe, ich einfach mit eine neue Klasse mit dem VC6 hinzugefügt, abgeleitet von CListCtrl.
    Somit habe ich die beiden Klassen:
    Linke Seite CMCheckView als CListCtrl
    Rechte Seite CMCheckKonto als CListCtrl

    Wie gesagt nun versuche ich, wenn ich einen Eintrag in der Klasse CMCheckKonto markiere oder per DBLClick, dann soll ein String in die Klasse CMCheckView übergeben werden. Denn will ich dann mit dem Befehl GetListCtrl().InsertItem usw. einfügen.

    Ich weiß nicht mehr weiter 😡

    Mfg Anlen



  • Hmm... was du da so nettes erzählst kann nicht.

    An sonnsten... du brauchst dann nen Pointer um von der einen klasse auf die andere zugreifen zu können... ist aber kein Problem wenn ich weiß wie deine Klassen aufgebaut sind 😃

    Zeig mal die Klassendeclaration von CMCheckView .... dann kann man dir helfen 😉



  • Hallo,

    ich hoffe Du meinst diesen Code:

    #if !defined(AFX_MCHECKVIEW_H__B18560A1_681D_4128_BBAA_7C941474892E__INCLUDED_)
    #define AFX_MCHECKVIEW_H__B18560A1_681D_4128_BBAA_7C941474892E__INCLUDED_

    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000

    class CMCheckView : public CListView
    {
    protected: // Nur aus Serialisierung erzeugen
    CMCheckView();
    DECLARE_DYNCREATE(CMCheckView)

    // Attribute
    public:
    CMCheckDoc* GetDocument();

    // Operationen
    public:

    // Überladungen
    // Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    //{{AFX_VIRTUAL(CMCheckView)
    public:
    virtual void OnDraw(CDC* pDC); // überladen zum Zeichnen dieser Ansicht
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    virtual BOOL PreTranslateMessage(MSG* pMsg);
    protected:
    virtual void OnInitialUpdate(); // das erste mal nach der Konstruktion aufgerufen
    //}}AFX_VIRTUAL

    // Implementierung
    public:
    void Test();
    virtual ~CMCheckView();
    #ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
    #endif

    protected:

    // Generierte Message-Map-Funktionen
    protected:
    //{{AFX_MSG(CMCheckView)
    afx_msg void OnTbStop();
    afx_msg void OnTbLoeschen();
    afx_msg void OnExtrasOptionen();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };

    #ifndef _DEBUG // Testversion in MCheckView.cpp
    inline CMCheckDoc* CMCheckView::GetDocument()
    { return (CMCheckDoc*)m_pDocument; }
    #endif

    Mfg Anlen



  • Und wie erstellst de die Splitter?

    PS: Use code-tags ...



  • Hallo,

    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
    	CCreateContext* pContext)
    {
    	// Unterteiltes Fenster erstellen
    	if (!m_wndSplitter.CreateStatic(this, 2, 1))
    		return FALSE;
    
    	if (!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CMCheckView), CSize(0, 0), pContext) ||
    		!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMCheckKonto), CSize(0,130), pContext))
    	{
    		m_wndSplitter.DestroyWindow();
    	}
    

    Richtig??



  • Also ich hab jetzt gerade net die Zeit dir was besonders ordentliches und schönes zu schreiben... aber:

    class CMainFram : public // ... 
    {
        // ...
    public:
        CSplitterWnd* GetSplitter(void) { return &m_wndSplitter; } // <= DAS muss de hinzufügen!
        // ...
    protected:
       CSplitterWnd m_wndSplitter; // Das solltest de schon da haben ...
    }
    

    Und dann gehts los 😃

    // Also als erstes die Header:
    #include ".\mainfrm.h"
    #include ".\mcheckdoc.h"
    #include ".\mcheckview.h"
    
    // Wo du das in der Klasse CMCheckKonto auch immer bruachst ... muss de da halt einfügen:
    
    // Nen Pointer auf die View holen :)
    CMCheckView* pwndCheckView = ((CMCheckView*)(((CMainFrame*)(AfxGetMainWnd()))->GetSplitter()->GetPane(1, 0)));
    
    if (!pwndCheckView)
        return;
    
    // Jetzt können wa es bsw so nutzen:
    pCheckView->GetListCtrl()->InserItem(...);
    

    😃

    Ist nicht getestet... bloß hier reingehämmert 😃

    Referenzen:
    CSplitterWnd::GetPane



  • Hallo,

    es funktioniert:

    CMCheckView* pwndCheckView = ((CMCheckView*)(((CMainFrame*)(AfxGetMainWnd()))->GetSplitter()->GetPane(1, 0)));
    
    	if (!pwndCheckView)
        return; 
    
    	pwndCheckView->GetListCtrl().InsertItem(0,"Hallo",0);
    

    Vielen Dank

    Werde jetzt mal schauen wieso.

    Mfg
    Anlen



  • Ganz einfach... du hast warscheinlich keinen Pointer auf deine Views gehabt 😉

    Um meinen Code mal zu erklären:

    (((CMainFrame*)(AfxGetMainWnd()))
    

    AfxGetMainWnd holt uns einen CWnd Pointer auf das Hauptfenster... was bei einer SDI bzw MDI Anwendung immer das MainFrame ist...
    So... damit wir auf die Funktionen der von CWnd abgeleiteten Klasse CMainFrame zugreifen können, müssen wir also nach CMainFrame* casten...

    ->GetSplitter()
    

    Die Funktion haben wir ja selber angelegt... Sie gibt uns einen Zeiger auf den Splitter zurück 🙂

    ->GetPane(1, 0)
    

    Liefert uns einen CWnd Pointer von dem SplitterWnd Pannel in der 2. Row. Da wir auchnoch wissen, das wir dort ein CMCheckView erstellt haben, können wir unseren CWnd nun in die davon abgeleitete Klasse CMCheckView casten..

    So... und schon sind wir am Ziel angelangt, wo wir die Public Memberfunctionen von CMCheckView benutzen können 🙂


Anmelden zum Antworten