pDoc-Zeiger in neu angelegter Klasse verwenden

steffi1985

Grünschnabel
Hallo Ihr!

Ich habe ein (wahrscheinlich typisches) Anfängerproblem:
Also in der OnDraw-Methode meiner Ansichtsklasse erhalte ich ja über

CTitelDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

Zugriff auf's Dokument. Nun habe ich eine neue Klasse angelegt, die auch auf Daten aus dem Dokument zugreifen muss...aber leider gibt er mir beim Einfügen des obigen Codes immer

"error C3861: 'GetDocument': identifier not found, even with argument-dependent lookup"

aus. Was muss ich ändern, damit ich auch von dieser Klasse aus auf das Dokument zugreifen kann?


Vielen Dank!

Gruß Steffi.
 
GetDocument ist eine Memberfunktion von den CView-Klassen. Da kommst du von einer anderen Stelle nicht direkt dran.

Du kannst dir entweder vom MainFrame mit GetActiveDocument das aktive CDocument holen, das ist dann allerdings nur wirklich vom Typ CDocument; das müsstest du dann entsprechend umcasten (oder mit dem MFC-eigenen RTTI prüfen).

Oder du merkst dir in deiner CxxxApp einen Pointer auf dein Document (wenn es eh nur eines ist, dann gibt es ja keine Missverständnisse), den du im Constructor von CDocument setzt (theApp.m_pMeinDoc = this).

Das ist generell eines der MFC-Probleme (bzw. eines der fanatisch-OOP-programmieren-Probleme), man hat ja doch immer ein oder zwei Sachen, auf die man von verschiedenen Stellen zugreifen möchte. Du könntest auch auf ein Singleton zurückgreifen, in dem du verschiedene, für dich wichtige Variablen, speicherst.


Dies ist ein langer, sinnlos durch Kommata getrennter, aber dennoch wichtiger Satz, der lediglich zur Verwirrung des Lesers führen soll.
 
Zuletzt bearbeitet:
Endurion hat gesagt.:
Du kannst dir entweder vom MainFrame mit GetActiveDocument das aktive CDocument holen, das ist dann allerdings nur wirklich vom Typ CDocument; das müsstest du dann entsprechend umcasten (oder mit dem MFC-eigenen RTTI prüfen).


Danke für deine Antwort!

Wenn ich in der neu angelegten Klasse GetActiveDocument aufrufen möchte, dann sagt er ebenfalls, dass er das nicht kennt...was muss ich denn da wo genau hinschreiben? :confused:


Ganz liebe Grüße, Steffi.
 
Da wird es wieder knifflig, im Prinzip ist das nur eine Problemverlagerung des Ganzen. Das ist jetzt nur aus dem Kopf, ich könnte also (mal wieder) danebenliegen:

In deiner CWinApp wird ein Pointer auf deinen MainFrame gespeichert, allerdings nur als CWnd. Das macht aber nichts, weil wir den brutal auf CMainFrame casten. Von da aus hast du dann auch Zugriff auf GetActiveDocument:

CMainFrame* pMainFrame = (CMainFrame*)theApp.m_pMainWnd;
CDocument* pDoc = pMainFrame->GetActiveDocument();

Und wenn du sicher bist, dass du nur CTitelDoc-Dokumente hast, dann kannst du damit weiter-casten:

CTitelDoc* pTitelDoc = (CTitelDoc*)pDoc;

Wenn nicht, kannst du mit dem MFC-eigenen RTTI testen:

Code:
if ( pDoc->IsKindOf( RUNTIME_CLASS( CTitelDoc ) ) )
{
  // jetzt ist es ganz sicher ein CTitelDoc
  CTitelDoc*  pTitelDoc = (CTitelDoc*)pDoc;
}
 
Zurück