CSplitterWnd Daten nach anderer Klasse übergeben
-
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 seinKann 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 CListCtrlWie 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 > 1000class 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;
#endifprotected:
// 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; }
#endifMfg 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
