Mehrere Dokumentvorlagen im MDI

HolgerX

Mitglied
Hallo!

Die Liste meiner Probleme wird leider nicht kürzer.
Da ich für meine Aufgabe verschiedene Dokumentvorlagen nutzen muss, versuche ich das zu realisieren.
Dabei bin ich so vorgegangen, wie es ein Buch mir geraten hat:
In InitInstance() habe ich einen zweiten Aufruf der Funktion AddDocTemplate() hinzugefügt.
Um ein neues Dokumentobjekt zu bekommen, habe ich eine neue Klasse hinzugefügt, die von CDocument abgeleitet ist.
Außerdem habe ich eine Sicht für die zweite Dokumentvorlage angefertigt, indem ich eine Klasse hinzugefügt habe, die von CView abgeleitet ist.

Als ich den ganzen Kram dann kompilieren wollte, hat er mir in der Klasse, CxyzApp Fehlermeldungen rausgeschmissen, dass in der neuen CabcView Klasse was nicht stimmt.

Was muss ich von der CxyzDoc (bzw. von CxyzView) in meine neue Klasse CabcDoc (bzw. CabcView) alles übernehmen an Variablen, Methoden und (vor allem) Makros, damit der Kompiler mir keine Fehlermeldung rausschmeisst?
 
Code:
ParameterView.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: virtual struct CRuntimeClass * __thiscall CParameterView::GetRuntimeClass(void)const " (?GetRuntimeClass@CParameterView@@UBEPAUCRuntimeClass@@XZ)
Wobei CParameterView meine neue Klasse CabcView ist.

Code:
Debug/Teead001.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Teead001 heisst meine Anwendung.
 
Hast du das im Header?
Code:
DECLARE_DYNCREATE(ParameterView)
Und das in der Cpp?
Code:
IMPLEMENT_DYNCREATE(ParameterView, hierdiebaseclass)
Wenn das fehlte, würde es den Fehler erklären.

Kannst du auch noch deine InitInstance() bzw zumindest die Aufrufe von AddDocTemplate() posten?
 
Ich habe sowas auch in einem Programm drin, der Aufruf bei AddDocTemplate wird ja vermutlich stimmen, meiner sieht so aus:

Code:
  pFontTemplate = new CMultiDocTemplate( IDR_PAINTERFONTVIEW_TMPL,
			                                   RUNTIME_CLASS( CPainterFontDoc ),
    		                                 RUNTIME_CLASS( CMDIChildWnd ),		
 	 	                                     RUNTIME_CLASS( CPainterFontView ) );
  AddDocTemplate( pFontTemplate );

  // Einzelbild-Template
	pDocTemplate = new CMultiDocTemplate( IDR_PAINTETYPE,
		                                    RUNTIME_CLASS( CPainterDoc ),
		                                    RUNTIME_CLASS( CChildFrame ),
		                                    RUNTIME_CLASS( CPainterView ) );

  AddDocTemplate( pDocTemplate );

Ich nehme mal an, du hast das zweite DocTemplate selbst erstellt, wichtig ist für das GetRuntimeClass, dass du eins der IMPLEMENT_DYNAMIC, IMPLEMENT_DYNCREATE oder IMPLEMENT_SERIAL Makros benutzt.

Bei mir steht in der Header-Datei innerhalb der Klassendefinition DECLARE_DYNCREATE(CPainterFontDoc) und in der Cpp-Datei IMPLEMENT_DYNCREATE(CPainterFontDoc, CDocument). Damit sollte das GetRuntimeClass eigentlich möglich sein.


Die Wege des MFC sind unergründlich und/oder funktionieren nicht.
 
Danke,

das IMPLEMENT_DYNCREATE(CParameterView, CView) hatte ich tatsächlich vergessen.
Das ist mir auch gerade aufgefallen, als ich mir in der Hilfe mal angeschaut habe, wozu das Makro überhaupt nütze sein soll.

Allerdings bekomme ich jetzt neue Fehlermeldungen:

Code:
d:\teead001\parameterview.h(21) : error C2143: Syntaxfehler : Fehlendes ';' vor '*'
d:\\teead001\parameterview.h(21) : error C2501: 'CParameterDoc' : Fehlende Speicherklasse oder Typbezeichner
d:\\teead001\parameterview.h(21) : error C2501: 'GetDocument' : Fehlende Speicherklasse oder Typbezeichner
D:\Teead001\ParameterView.cpp(37) : error C2440: 'initializing' : 'int *' kann nicht in 'class CParameterDoc *' konvertiert werden
        Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

Dabei steht in Zeile 21 in CParameterView folgendes:
Code:
	CParameterDoc* GetDocument();
 
Jap, das habe ich gleich kontrolliert. Denn wie oft vergisst man soetwas mal. :rolleyes:

Die Fehlermeldung muss also eine andere Ursache haben.
Irgendwie kann er keinen Pointer auf CParameterDoc anlegen. :(
 
Den Fehlermeldungen nach kennt er in Zeile 21 der .h CParameterDoc nicht - also wird es nicht richtig includerd. Mal eine Frage: Hast du die .h kopiert? Hast du die Guards oben (#ifndef usw.) angepasst? Wenn das die gleichen sind wie in der anderen Datei, dann übersrpingt der Compiler sie.
 
Ich habe da nichts angepasst.
Muss ich denn?

Dieser ganze #ifndef Krams geht mir irgendwo am *** vorbei.
Wenn es denn von nöten ist, dann sollte das VS für mich machen!

Am Anfang steht nur:
Code:
#if !defined(AFX_PARAMETERVIEW_H__992AD8AD_3F80_4602_B869_85F108616B9F__INCLUDED_)
#define AFX_PARAMETERVIEW_H__992AD8AD_3F80_4602_B869_85F108616B9F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
Sonstiger Debug - Krams steht dort nicht.
 

Neue Beiträge

Zurück