Dokument-Objekt aus ...App-Klasse ansprechen

HolgerX

Mitglied
Wie kann ich in meiner MDI aus der CxyApp-Klasse eine Methode in einer Dokument-Klasse ansprechen?

In meiner CxyApp habe ich die OnFileOpen() überschrieben. Jetzt will (muss) ich in dieser Methode eine Methode meiner CabcDoc Klasse aufrufen.

Da die einzige Methode die Serialize()-Funktion ist, die bei der Instanziierung des CabcDoc Objektes aufgerufen wird, habe ich ein Problem. - Denn Die OnDraw()-Funktion der CabcView-Klasse will munter loszeichnen, hat aber noch keine Werte des Dokuments, die außerhalb der Serialize()-Funktion initialisiert werden.:(


So, wie kann ich nun das Dokument (CabcDoc), bzw. deren Methoden in der FileOpen()-Methode der App-Klasse ansprechen?
 
Wenn du OnFileOpen überschrieben hast, erstellst du dann dein Document über das DocTemplate selbst?

Wenn ja, ist es ja einfach. Dann weisst du, das dein Template immer ein CabcDoc erzeugt; einfaches Casten sollte da reichen.

Ansonsten musst du das Template vom Document mittels GetDocTemplate holen, vergleichen und dann Casten.

Du kannst natürlich auch deine Dokument ALLE von einer Zwischenklasse ableiten (die von CDocument abgeleitet ist) oder ein Interface zusätzlich einbauen. Diese Zwischenklasse bzw. das Interface kann dann eine GetDocType zur Verfügung stellen. Das neu erzeugte CDocument muss ja dann davon abgeleitet sein, und ein sicherer Cast sollte möglich sein.

Abgesehen von dem ganzen casten, MFC hat ja sein eigenes RTTI, damit müsstest du eigentlich auch feststellen können, ob es sich um ein CabcDoc handelt (IsKindOf).
 
Original geschrieben von Endurion
Wenn du OnFileOpen überschrieben hast, erstellst du dann dein Document über das DocTemplate selbst?

Wenn ja, ist es ja einfach. Dann weisst du, das dein Template immer ein CabcDoc erzeugt; einfaches Casten sollte da reichen.
Wie kann ich es einfach casten?
Ich habe das Dokument folgendermaßen erzeugt:
Code:
CDocManager* pManager = AfxGetApp()->m_pDocManager;
POSITION pos = pManager->GetFirstDocTemplatePosition();
CDocTemplate* pTemplate = pManager->GetNextDocTemplate(pos);
pTemplate->OpenDocumentFile( m_sDateiName );
So wurde eine Dokumentvorlage der Klasse CabcDoc erzeugt.
Jetzt will ich z.B. die Funktion FunktionEins(int x) von dieser Klasse CabcDoc aufrufen.

Wie kann ich nun diesen Zeiger auf das CDocTemplate in CabcDoc casten?
Code:
((CabcDoc)pTemplate)->FunktionEins(22);
funktioniert jedenfalls nicht. :(
 
Probier mal:

Code:
((CabcDoc*)pTemplate)->FunktionEins(22);

Der Zeiger ist entscheidend! Glaube allerdings trotzdem nicht, dass es klappt, weil du die Vererbung hier scheinbar umdrehst. Hast du CabcDoc von irgendetwas abgeleitet? Wenn es von CDocTemplate abgeleitet ist, dann solltest du einfach das CabcDoc Objekt anstelle des CDocTemplate Objektes erzeugen, dann kannst du die Funktion auch problemlos aufrufen. Dieses gecaste hier funktioniert nur, wenn CDocTemplate von CabcDoc abgeleitet wäre.
 
Zuletzt bearbeitet:
Danke!

Aber wie schaffe ich es nun, dass diese Funktion CabcDoc.FunktionEins()aufgerufen wird, bevor CabcView.OnDraw() aufgerufen wird?
Bzw. wie rufe ich CabcView.OnDraw() dann nochmal zum updaten auf (innerhalb von CabcDoc.FunktionEins() )?
Einfach durch update(); ?
 
Zuletzt bearbeitet:
Am besten über Invalidate. Das schiebt dann ein WM_PAINT auf den Queue, und der View bekommt OnDraw aufgerufen.
 
Zurück