CFormView OHNE Dokument-/Ansichtarchitektur
-
Hallo
Ich würde gerne ein MDI-Programm schreiben, das in den Child-Fenstern Formulare darstellt. Wie das mit der Dokument-/Ansichtarchitektur geht ist relativ einfach. -> View-Klasse anstatt von CView von CFormView ableiten. Wie funktioniert das aber, wenn man keine Dokument-/Ansichtarchitektur benutzt? Das erste Problem das sich hier stellt ist, daß man bei der View-Klasse (beim Assistenten) gar keine Auswahlmöglichkeiten für die Basisklasse hat und auch die View-Klasse nicht von CView abgeleitet ist, sondern von CWnd. Warum ist das so? Damit könnte ich ja noch leben. Wenn ich dann allerdings mit dem Assistenten eine neue Klasse einfüge und diese dann von CFormView ableite, dann ist das Problem, daß der Konstruktor protected ist (und das soll bestimmt auch so bleiben sonst wäre es ja nicht so, ich habe nämlich auch schon versucht alles public zu machen und das irgendwie hinzubiegen, aber das geht nicht wirklich). Wie kann ich nun diese von CFormView abgeleitete Ansichtklasse einem Childframe hinzufügen? Geht das überhaupt ohne Dokument-/Ansichtarchitektur?
Danke
-
Geht.
Der Wizard ist halt auf Doc/View-Architektur zugeschnitten. Was soll's

Der Constructor ist protected, weil die MFC davon ausgeht, daß du Views sowieso nur dynamisch (also über CRuntimeClass::CreateObject) erzeugst. Frag mich aber nicht, warum das besser sein soll....
Du kannst den Constructor public machen, und dann mit CFormView::Create das Formular erzeugen.
-
Das Dialog-Fenster läßt sich jetzt erstellen. Wenn ich aber das Fenster schließe, dann gibts eine Exception. Wie bekomme ich die jetzt weg?
-
*g*
Dazu müßt ich wissen wie du's erstellst, wie du's löschst und was für eine Exception...
-
Erstellt mit:
if (!m_wndView2.Create(NULL,NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL)) { TRACE0("Ansichtsfenster konnte nicht erstellt werden\n"); return -1; }Löschen tu ich es gar nicht. Ich habe aber rausgefunden, das wenn ich DestroyWindow aufrufe, daß dann dieselbe exception kommt, wie wenn ich gar nichts mache (Ich vermute deshalb, dass der Fehler in der CFormView-Klasse liegt). Die Exception ist glaube ich relativ nutzlos, weil sie in der dbgheap.c ist. Wird wohl irgendwas internes sein, weil ich die CFormView klasse nicht richtig initialisiere oder sowas.
Ich habe eigentlich nichts anderes gemacht ausser mit dem Assistenten eine MFC-Anwendung erstellt (ohne Dokument-/Ansichtarchitektur) und dann eine Klasse eingefügt (von CFormView abgeleitet), und dann diese als View-Klasse benutzt, anstelle der "normalen" von CWnd abgeleiteten Klasse.
-
Ich habe gerade mal nachgeforscht und die View-Klasse nur von CView abgeleitet, und auch hier kommt die selbe Exception. Also muss der Fehler innerhalb von CView liegen. Kann es vielleicht sein, daß die View-Klassen nur in Zusammenarbeit mit Document-Klassen benutzt werden können, und daß wenn keine CDocument-Klasse existiert, daß dann die CView-Klasse fehlerhaft arbeitet?
-
Du kannst auch dort hin debuggen wo der Fehler auftritt und uns die Zeile nennen.
-
Ich glaube nicht dass es Sinn macht sich weiter mit dieser Exception zu beschäftigen. Es wäre viel besser, wenn mir jemand, der weiß wie man CFormViews auch ohne Dokument-/Ansichtarchitektur verwendet, genau sagt wie man es macht.
Falls das nicht auf eine einfache weiße zu lösen ist, dann werde ich wahrscheinlich die Dokument-/Ansichtarchitektur verwenden und alles was ich nicht davon brauche wegfallen lassen/ignorieren.
-
ne exception ist niemals "Nutzlos" wenn man 'nen Fehler sucht.
(Und den sollte man sowieso erstmal bei sich selbst suchen, und nicht inner Bibliothek)dbgheap.c sagt mir z.B. schonmal daß dein Heap zerrammelt wird. Views werden normalerweise von der MFC dynamisch erstellt und gelöscht, deswegen wohl auch der Fehler (dein m_wndVie schein ein Klassenmember zu sein - mal mit new erzeugen und nicht löschen, aber Breakpoint of DTor um zu sehen daß er auch wirklich gelöscht wird)
Ich kann dir leider so auf die Schnelle kein Beispiel schicken wei das "Company Code" ist, und ich zu haus kein VC6 installiert hab.
Gibt es eigentlich einen Grund für den CFormView? Prinzipiell kannst du auch einen Dialog nehmen und mit Create erzeugen. Sind zwar ein paar sachen anders (näher an der Win32 dran), aber das macht ja nix.