Zeiger auf CListView funktioniert nicht
-
Was gibst du als Parent Window des Dialogs (Bei DoModal bzw. Create) an?
Warum gibst du dem Dialog nicht einen Zeiger auf die Liste mit?c)
class CFoo { int m_x; // << Datenmember, Membervariable, Attribut, Eigenschaft, int X(); // << (Member-)Funktion, Methode, Nachricht };
folgendes Problem: Wenn es zu der Liste kein Objekt gibt oder du aus einem anderen Thread kommst, geben GetParent() usw. ein temporäres CWnd-Objekt zurück, das diese Datenmember nicht kennt.
Splitte mal den Code auf, und trace raus, ob du ein CListCtrl mit Gültigem HWND bekommst (::IsWindow(wnd->GetSafeHwnd())
-
Aber ich kann doch nicht in einem CListView nach einem CListCtrl suchen, oder? Das ganze ist nämlich ein SDI. (Sorry, das hätte ich vielleicht schon früher sagen müssen)

-
Aber ich kann doch nicht in einem CListView nach einem CListCtrl suchen, oder?
nein, aber ein CListView ist ein CListCtrl
was nicht ganz so einsichtig ist, Microsoft verwendet hier halt ein paar dirty tricks (die auch für abgeleitete Klassen funktionieren - solange du keine neuen Datenmember einführst)Also - nochmal:
Was gibst du als Parent Window des Dialogs (Bei DoModal bzw. Create) an?
Warum gibst du dem Dialog nicht einen Zeiger auf die Liste mit?
-
Zu deiner ersten Frage: Keine Ahnung. Ich habe den Dialog ganz normal aufgerufen und sonst nix daran verändert.
Wie bekomm ich überhaubt einen Zeiger auf den CListView?
-
SDI?
CView * activeView = AfxGetMainWnd()->GetActiveView();
das Ding könntest du dann eigentlich problemlos nach CListView (oder was auch immer deine View-Klasse ist) casten.
Ich fände aber folgendes sinnvoller:
der Dialog bekommt einen public Member CListView *
Bevor das Dialogfenster geöffnet wird (DoModal oder Create) setzt du diesen member auf die Liste.Wenn du z.B. den Command-Handler für den Menü/Toolbar-Befehl dem View zuordnest, ist das ja kein problem.
-
Ich hab es jetzt mal so ausprobiert:
CEditorDlg m_dlgEditor; CView *pView = AfxGetMainWnd()->GetActiveView(); m_dlgEditor.pList = (CListView*)pView; m_dlgEditor.DoModal();Das Problem ist jetzt aber, dass "GetActiveView() kein Element von CWnd" ist...
-
sorry, ja, AfxGetMainWnd() gibt das hauptfenster zurück, mußt du erst nach CMainFrame casten
CEditorDlg m_dlgEditor; CMainFrame * mainWnd = (CMainFrame *) AfxGetMainWnd(); CView *pView = mainWnd->GetActiveView(); m_dlgEditor.pList = (CListView*)pView; m_dlgEditor.DoModal();
-
Ich kann deinen Code zwar kompilieren, aber wenn ich von dem Dialog dann folgenden Zeilen aufrufe kann man wieder keine Veränderungen am View erkennen.
pList->GetListCtrl().InsertItem(0,"Erstellt ein Item",0); pList->Invalidate();Muss ich da noch etwas hinzufügen?
-
Nö, nicht mal das Invalidate ist nötig.
Ist schwer zu finden, so ohne Projekt...
Kannt du von anderer Stelle (z.B. im View - OnCreate) was einfügen?
-
Naja, das Ding ist nicht besonders groß. Willst du nicht nen Blick drauf werfen? Ich weiß nämlich nicht mehr weiter und du hast bestimmt mehr Ahnung davon. Du würdest mir auf jeden Fall viel helfen...

-
Schick's halt her. hauptmannp at yahoo dot com. Aber ich versprech nix

-
OK, gefunden.
Der Dialog wird vom CISPluginBuilderView aus erzeugt (linke Seite) erzeugt, der dann auch der aktive View ist.
Du mußt dem Dialog einen zeiger auf die CISPluginBuilderList mitgeben.Am besten in Mainframe::OnCreateClient jedem View jeweils einen Zeiger auf den anderen mitgeben, daß die zwei wissen, daß sie zusammengehören.
Und dem Dialog dann den zeiger auf die Liste mitgeben.
-
Welchen Code muss ich da einsetzen? Ich weiß nämlich nicht, wie ich einen Zeiger auf die Klasse bekomme.