Objektverwaltung in MFC

DonCube

Mitglied
Hallo,
ganz kurze Frage. Wer verwaltet eigentlich die ganzen Objekte in MFC? Ich würde nämlich gerne etwas an die VIEW übergeben. Aber habe keine Ahnung wo das eigentliche Objekt der Klasse ist. Das einzigste mal, dass ich die VIEW "Aufrufe" ist bei der Übergabe im Kontroller ans DocTemplate.

Ich glaube ich bin noch zu sehr im Muster von Java drin. Da hatte ich immer meine Klassen die bestimmte Objekte instantiieren und verwalten. Im Kontroller von MFC fehlt mir sowas. Oder es hat sich gut versteckt.

Gruß
DonCube
 
Hallo,

entscheidend ist, von welcher Klasse du etwas übergeben willst.
Gehen wir mal aus, du willst von CMainFrame etwas übergeben. Dann mußt du dir als erstes einen Zeiger auf deine View-Klasse besorgen
Code:
CMeineView *pView=(CMeineView*)GetActiveView();
Dann kannst du über diesen Zeiger auf Variable oder Funktionen der View zugreifen
Code:
pView->meineVariable=wert;
pView->MeineFunktion();
Etwas komplizierter ist es, wenn du von der Doc-Klasse (allgemein eigentlich unüblich) oder einer anderen Klasse auf die pView zugreifen willst. Dann brauchst du zunächst einen Zeiger auf das Hauptfenster und holst dir da den Zeiger auf die View
Code:
CMainFrame* pMainFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CMeineView *pView=(CMeineView*)pMainFrame->GetActiveView();

Mfg

langer
 
Vielen Dank erstmal für deine, wirklich sehr ausführliche und gute Antwort. Bin begeistert.
Habe es zwar schon rausgefunden. Aber deine Aufstellung hat mein Verständniss nochmal vertieft. Habe mir bereits vorher folgende Architektur für das Programm ausgedacht.

Ich verwalte alle Eingaben und ein Optionsobjekt in einer Global, die nach dem Singletonmuster aufgebaut ist. Sie bietet auch die passenden Schnittstellen für Dialoge und Eingabedaten.

Die CMyApp besitzt eine Referenz auf die Global. Bleibt nur noch die Frage wie ich auf dauer die Handler für Buttons und Co zum speichern der Eingaben darauf zugreifen lasse.

Die CMyView und eine Rechenklasse sind mittels Observer an die Optionen angebunden. Den sie müssen sich änder wenn die Optionen geändert werden.

An dieser Stelle muss ich gestehen, dass sich das Model-View-Controller Prinzp besser ausnutzen lässt. Allerdings weiß ich noch nicht genau wie. Da ich dieses Prinzip noch nie richtig angewendet habe. Falls du eine Idee hast, wie man das am besten machen könnte, lass es mich wissen.


MfG
DonCube

PS: So habe ich es bisher gelöst.
Global:
Code:
//Get View and add the new Pages
	pView = CTabView::GetView();
	pView->addPages(newPages);

CMyView:
Code:
//Static Function to get a reference on the View
CTabView* CTabView::GetView(){
      
      CFrameWnd * pFrame = (CFrameWnd *)(AfxGetApp()->m_pMainWnd);
      CView * pView = pFrame->GetActiveView();

      if ( !pView )
         return NULL;

      //Last controll of right instance
      if ( ! pView->IsKindOf( RUNTIME_CLASS(CTabView) ) )
         return NULL;

      return (CTabView *) pView;
}
 
Zuletzt bearbeitet:
Hallo,

in der MFC und C++ geht das meiste über Zeiger. Mir scheint, du bildest zu sehr Java auf C++ ab. Das solltest du strikt auseinander halten, denn das sind zwei ganz verschiedene Sprachen.
Z.b implementierts du in der TabView eine Funktion zur Rückgabe des Zeigers. Den Codeschnipsel, den ich dir geschrieben habe (letzter Codesdchnipsel) erlaubt dir aber eigenständig von jeder Stelle des Programms den Zeiger zu holen. Außerdem kenne ich in C++ und MFC kein Gobal. Bei der Doc-View-Architektur werden z.B. alle Zeichen-Routinen in der View implementiert. Für die Daten, die verwaltet werden müssen, ist die Doc-Klasse zuständig. Hier wird auch serialisiert, d.h. die Daten gespeichert und geladen. Und die Klasse CMainFrame ist das Bindeglied zwischen beiden und sichert die Befehlsbehandlung.
Anmerkung: Das ist eine sehr grobe Beschreibung und sollte nur ein Anstoß sein, sich damit zu beschäftigen. Denn auch in der View kann es wie in jeder anderen Klasse Ereignishändler geben. Aber das hängt sehr vom Programm ab, das man schreibt.

Mfg

langer
 
Ahh ich glaube, da hast du was falsch interpretiert. CGlobal ist nur eine Klasse
die ich selbst implementiert habe in der ich alle Referenzen (Zeiger) auf Einstellungs- und Datenobjekte verwalte. Also im Prinzip das wofür sonst die MyDoc für zuständig ist.

Ich war mir am Anfang nicht sicher inwiefern das mit der Doc funktioniert, also habe ich im Prinzip meinen eigenen Datenhandler programmiert. Aber du hast recht sollte den Kram lieber in der Doc speichern das ist Architektur gerechter. Muss mich halt noch ein wenig an MVC gwöhnen. ;-)

Da fällt mir gerade noch eine Frage ein:
**********************************************
Gibt es eine Möglichkeit in MFC Fehlerdialoge aufzurufen? Also gibt es da schon vorgefertigte oder muss man die komplett selbst erstellen? (Im Borland Builder gabs da mal was schönes, wenn ich mich recht erinner.)

Anwort:
*********
Hat sich schon erledigt. Das erstellen von Fehlerdialogen geht wunderbar mit:
Code:
if(strlen(tmp)>3){
         AfxMessageBox("Diese Eingabe ist ungültig. Es sind nur bis zu 3 Zeichen erlaubt.", MB_OK | MB_ICONEXCLAMATION);
	AfxThrowUserException();
}

Gruß
DonCube
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück