Baumstruktur im Laufzeit anlegen/ändern
-
Komischerweise führt bei mir, wenn ich die obige Code in einer eigene Funktion (innerhalb der View-Klasse) reinpacke, zur einem Absturz. In Aufrufliste wird die Stelle gezeigt, an dem der Baumwurzel angelegt wird.
hier:vaterItem = GetTreeCtrl().InsertItem(_T("TABS"),0,0,TVI_ROOT,TVI_LAST);
-
Und warum?
Was sagt der Callstack?
Ist das Fenster schon angelegt?
Wie kommst Du an die Funktion?
Woher hast Du das Objekt mit dem Du die Funktion aufrufst?
-
Martin Richter schrieb:
0.Und warum?
1. Was sagt der Callstack?
2. Ist das Fenster schon angelegt?
3. Wie kommst Du an die Funktion?
4. Woher hast Du das Objekt mit dem Du die Funktion aufrufst?Zu 0. Keine Ahnung
Zu 1. Ein Debug Assertion Failed wird als Fehlermeldung ausgegeben. Wenn man aufs Wiederholen geht springt der Compiler in afxcmn.inl-Datei. Dabei wird die Zeile{ ASSERT(::IsWindow(m_hWnd)); return InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, lpszItem, nImage, nSelectedImage, 0, 0, 0, hParent, hInsertAfter); }markiert. m_hWnd zeigt 0x00000 an.
Zu 2. Das Projekt ist nach Windows-Explorer Stil erzeugt wurden. D.h. in der linken Spalte kommt der Baum rein. Also kein Popup-Fenster
Zu 3. Die Funktion, die den Baumstruktur erzeugen soll, ist in LeftView angelegt und wird von ProjectDoc aus aufgerufen.
Zur 4. Der LeftView.h ist in ProjectDoc.h inkludiert. In ProjectDoc.h wird ein Instanz der Klasse wie folgt erzeugt:CLeftView tabMit Hilfe dieser Instanz wird die Funktion Baum_erzeugen() in LeftView aufgerufen..
-
Das Fenster existiert nicht! Esist evtl. noch nciht angelegt.
Wie machst Du das aus dem Dokument auf diese Funktion zuzugreifen.Tipp: Verwende in der Doc/View archtiektur immer UpdateAllViews/OnUpdate/OnInitialUpdate um zwischen Doc und View Daten auszutauschen.
Das Document wird evtl. vor dem View erzeugt. Und ein Dokument benötigt keinen View zur Existenz. Ich vermute mal, die Trennung zwischen Daten und Darstellung ist bei Dir nicht eindeutig.
-
Mhh.. und wie kriege ich den Handle aufs Fenster?
Mit GetDC etwa?
Ich will, dass der Baum im Laufe des Programms sich ändert und nicht durch ein zusätzlich Knopfdruck.
-
Wieso Knopfdruck? Sobald sich an Deinem Dokument was ändert, wird automatisch UpdateAllViews(), ... aufgerufen, vorausgesetzt Du teilst dem Framework die Änderung am Dokument mit.
-
Ja, anscheinend ist meine Referenzierung falsch. Denn diesen Code habe ich in OnDraw()- Methode der CLeftView verfrachtet und Breakpoint dorthin gesetzt siehe da dort wird gar nicht reingegangen. Also ich habe zwei View-Klasse :
CPrettView und CLeftView (Window-Explorer Stil). In CPrettDoc.h habe ich wie folgt eine Instanz der Klasse CleftView gebildet.public: CLeftView meinBaum;In CPrettDoc.cpp
meinBaum.Erzeuge_neues_Baum();In CLeftView.cpp
void Erzeuge_neues_Baum() { HTREEITEM vaterItem; HTREEITEM kindItem1; HTREEITEM kindItem2; HTREEITEM kindItem3; vaterItem = GetTreeCtrl().InsertItem(_T("Tabellen"),0,0,TVI_ROOT,TVI_LAST); kindItem1 = GetTreeCtrl().InsertItem(_T("Tabelle1"),1,1,vaterItem,TVI_LAST); kindItem2 = GetTreeCtrl().InsertItem(_T("Tabelle2"),1,1,vaterItem,TVI_LAST); kindItem3 = GetTreeCtrl().InsertItem(_T("Tabelle3"),1,1,vaterItem,TVI_LAST); GetTreeCtrl().InsertItem(_T("Tabelle3.1"),2,2,kindItem3,TVI_LAST); GetTreeCtrl().InsertItem(_T("Tabelle3.2"),2,2,kindItem3,TVI_LAST); GetTreeCtrl().InsertItem(_T("Tabelle3.3"),2,2,kindItem3,TVI_LAST); GetTreeCtrl().InsertItem(_T("Tabelle3.4"),2,2,kindItem3,TVI_LAST); }Wie kann ich nun LeftView richtig ansprechen?
-
Versuche doch erstmal zu verstehen, wie DocView in der MFC überhaupt funktioniert.
Dein Baum Objekt im Dokument wird weder erzeugt noch verwendet.
Das Framework erzeugt Deinen Baum an ganz anderer Stelle im mainfrm.cpp!
-
Martin Richter schrieb:
Versuche doch erstmal zu verstehen, wie DocView in der MFC überhaupt funktioniert.
Dein Baum Objekt im Dokument wird weder erzeugt noch verwendet.
Das Framework erzeugt Deinen Baum an ganz anderer Stelle im mainfrm.cpp!Ok, ich habe das Problem nun folgendermassen noch gelöst:
In CPrettDoc.cppPOSITION pos = GetFirstViewPosition(); CLeftView *ltab = (CLeftView *)GetNextView(pos); ltab->Erzeuge_neues_Baum(this); ltab->UpdateWindow();Danke trotzdem.

-
Wobei Du nur hoffen kannst, dass der erste View immer der Tree veiw ist.
Besser Du enummerierst alls Views und prüfst mit DYNAMIC_DOWNCAST ob Du den entsprechenden View gefunden hast.CMyViewClass *pView = NULL; for (POSITION pos= GetFirstViewPosition(); pos; ) { // Get the CViewDataForm object pView = DYNAMIC_DOWNCAST(CMyViewClass,GetNextView(pos)); if (!pView) break; } if (pView) { ... }Wichtig!
1. Views werden immer erst nach den Dokumenten erzeugt
2. Views müssen nicht existieren...