Problem mit CSplitterWnd
-
sorry!
Das war natürlich etwas falsch...Ich hab das immer mit einem von den beiden versucht!
Und das andere auskommentiert!Gibt aber dennoch einen "Debug Assertion Failed"!
-
Ja, und wozu ein 1x1-Feld?
Wenn man dem Debug-Fehler mal nachsteigen würde, würde man folgendes entdecken:ASSERT(nCols > 1 || nRows > 1); // 1x1 is not permitted
-
ok, das war auch nur ein Test, weil
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext *pContext) { // 1 VERIFY(m_wndSplitter.CreateStatic(this, 1, 2)); VERIFY(m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CDialogView),CSize(100, 100), pContext)); VERIFY(m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CNodeView),CSize(100, 100), pContext)); // 2. //return m_wndSplitter.Create(this,2,2,CSize(100,100),pContext); return TRUE; }
auch nicht funktioniert hat!
Also eben einen "Debug Assertion Failed"...
Oder ist das auch nicht korrekt was ich da mache?
-
Da es so in der MSDN steht, sollte es schon funktionieren. Allerdings sind Deine Hintergrundinformationen (Debug Assertion failed) sehr dürftig und eher unbrauchbar!
Da könntest Du auch fragen: "Mein Auto ist kaputt, woran liegts?"
-
Hi,
naja, ganz so ist es ja nicht...Es ist ja eigentlich ziemlich eindeutig, was nicht geht, oder sehe ich das falsch?
Die beiden Klassen sind einfach mit dem Class Wizard neu hinzugefügt, ansonsten hab ich dort noch nix gemacht!
In der CMainFrame-Klasse habe ich eine Member Variable vom Typ CSplitterWnd hinzugefügt und die OnCreateClient überschrieben.
Das war es da aber auch schon...Die Fehlermeldung bezieht sich auf die Datei WinSplitter.c und ich glaube irgendwas mit 150 oder so stand da nocht.
(Ich komme momentan nicht da ran, da ich nicht zu hause bin!)Gibt es da nicht zufällig "Achtung, sonst geht es in die Hose"-Tips?
Gruss, Tobias
-
Es ist ja eigentlich ziemlich eindeutig, was nicht geht, oder sehe ich das falsch?
Das siehst Du falsch, da ja das Beispiel auch so in der MSDN steht! Also muss irgendwo in Code, den wir hier nicht zu Gesicht bekommen haben, dieser Fehler generiert worden sein, möglicherweise ging das Erstellen der Views oder des SplitterWnd schief.
-
so, ich hab jetzt mal einen Beispiel-Code da:
http://www.tobis79211.de/test.rar...ist auch nur 38KB gross, wäre nett, wenn du ihn mal ansehen könntest, oder sonst jemand!
Was hab ich gemacht:
1. Neues SDI-Projekt, von CView abgeleitete CMainframe.
2. Klasse Ctest1 hinzugefügt, von CFormView abgeleitet
3. Klasse CTest2 hinzugefügt, von CView abgeleitet
4. In CMainframe Member-Variable vom Typ CSplitterWnd hinzugefügt.
5. Die OnOpenClient überschriebene...
Und es gibt doch einen Error...Wäre echt nett, wenn jemand dieses, eigentlich einfache Beispiel, sich anschauen könnte!!!
1000 Dank,
Tobias
-
ok, ich hab mir mal die Debug-Meldungen angeguckt...
Wenn ich also folgendes in der OnCreateClient mache, passiert folgendes:
a) ich mache nur
m_wndSplitter.CreateStatic(this, 1, 2);
dann kommt "Debug Assertion in Winsplitt.cpp, Zeile 364:
CWnd* pView = GetDlgItem(IdFromRowCol(row, col)); ASSERT(pView != NULL); // panes can be a CWnd, but are usually CViews
...was ich noch verstehe...
b) ich mache
m_wndSplitter.CreateStatic(this, 1, 2); VERIFY(m_wndSplitter.CreateView( 0, 1, RUNTIME_CLASS(CDialogView),CSize(100, 100), pContext)); VERIFY(m_wndSplitter.CreateView( 0, 1, RUNTIME_CLASS(CDialogView),CSize(100, 100), pContext));
wobei CDialogView von CFormView abgeleitet ist...
dann kommt "Debug Assertion in viewform.cpp, Zeile 69:if (!_AfxCheckDialogTemplate(m_lpszTemplateName, TRUE)) { ASSERT(FALSE); // invalid dialog template name PostNcDestroy(); // cleanup if Create fails too soon return FALSE; }
hier wird also (!_AfxCheckDialogTemplate(m_lpszTemplateName, TRUE) == true, aber ich habe keine Ahnung, was die Funktion mir sagen will...
c) ich mache
m_wndSplitter.CreateStatic(this, 1, 2); VERIFY(m_wndSplitter.CreateView( 0, 1, RUNTIME_CLASS(CNodeView),CSize(100, 100), pContext)); VERIFY(m_wndSplitter.CreateView( 0, 1, RUNTIME_CLASS(CNodeView),CSize(100, 100), pContext));
wobei CNodeView von CView abgeleitet ist und keine Dialog-ID hat!!!
dann kommt "Debug Assertion in Winsplitt.cpp, Zeile 255:if (GetDlgItem(IdFromRowCol(row, col)) != NULL) { TRACE2("Error: CreateView - pane already exists for row %d, col %d.\n",row, col); ASSERT(FALSE); return FALSE; }
wobei hier wohl aus irgendeinem Grund ein Fehler kommt wenn GetDlg==Null ist!
Ich hoffe, dass sind genug und genau genuge Fehlermeldungen dafür, dass bei mir nix geht...
Wäre echt klasse, wenn mir dabei jmd. helfen könnte!
Gruss, TobiasPS: Das ich 2mal diesselbe Klasse verwende ist zwar nicht so toll, scheint aber doch wohl nicht der Grund für das Problem zu sein, auch wenn ich CNodeView und CDialogView
[ Dieser Beitrag wurde am 03.03.2003 um 20:54 Uhr von tobis79211 editiert. ]
-
so, ich hab das hinbekommen, durch etwas schummelei:
Ich hab eine Beispiel-Klasse einfach zu meiner ausgebaut.
Dies hat dann geklappt.Allerdings würde mich als neugierigen Menschen schon interessieren, was oben das Problem war!!!!
-
|
[code type="C++" tabs="4" V
VERIFY(m_wndSplitter.CreateView( 0, 1, RUNTIME_CLASS(CNodeView),CSize(100, 100), pContext));
|
v
VERIFY(m_wndSplitter.CreateView( 0, 1, RUNTIME_CLASS(CNodeView),CSize(100, 100), pContext[/code]
-
Upps...
verdammte Code-Tags....
Dann eben ohne....Du hast 2*Mal:
VERIFY(m_wndSplitter.CreateView( 0, 1, RUNTIME_CLASS(CNodeView),CSize(100, 100), pContext));
VERIFY(m_wndSplitter.CreateView( 0, 1, RUNTIME_CLASS(CNodeView),CSize(100, 100), pContext));Das heisst selbes Pane, genau wie eben oben.
Hat ReneG schon gesagt...
-
Der Fehler bei c) ist ja wohl eindeutig, wenn Du 2x das gleiche Pane einrichten willst.
Der Fehler in deinem Code kommt daher, dass Du als Dialogresource einen 'normalen Dialog' erstellt hast. Dieser kann nur als Hauptfenster oder per DoModal() fungieren. Da das CFormView CTest1 allerdings ein ChildWindow des Splitters sein soll, muss dieser Dialog den Style WS_CHILD besitzen.
Dann funzt alles!
-
Hi René!
Vielen Dank...
Die Erklärung mit dem Dialog hat mir echt gut geholfen!
Gruss, Tobias