Benutzer mit den meisten Antworten
Nichtmodalen Dialog erstellen, falscher Konstruktor wird benutzt

Frage
-
Ich möchte einen MFC-Dialog nicht-Modal von einem Anderen Dialog erstellen(Anzeigen). Die Klasse des anzuzeigenden Dialoges ist von CDialogEx abgeleitet. Mein Modifizierter Konstruktor: CPrgActivities::CPrgActivities(CView* pView) : CDialogEx(CPrgActivities::IDD, pView) { TRACE("Non-Modaler-Konstruktor von CPrgActivities"); MessageBox(_T("2"), _T("2"), MB_OK); m_pView = pView; } Im Header des Hauptdialoges ist ein Zeiger definiert: CPrgActivities* m_pPrgActivities; Wenn ich nun im Konstruktor des Hauptdioaloges m_pPrgActivities = new CPrgActivities(this); Aufrufe, kommt wird der Standartkonstruktor verwendet. Ich brauche aber meinen Modifizierten. Wenn ich den Standartkonstuktor auskommentiere kommt der Fehler Fehler 1 error C2664: 'CPrgActivities::CPrgActivities(CView *)': Konvertierung des Parameters 1 von 'CProjectDlg *const ' in 'CView *' nicht möglich c:\...\documents\visual studio 2010\projects\project\project\projectdlg.cpp 64
VisualCPlusPlus
Antworten
-
Wo bitte erzeugst Du Deinen Dialog?
this ist eben an dieser Stelle kein View Zeiger sondern ein Dialog.Wenn Du aus einem Dialog einen anderen Dialog erzeugst und einen View Zeiger mitgeben willst, dann musst Du diesen View Zeiger auch an den ersten Dialog weitergeben.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert KK Senior Montag, 1. August 2011 14:17
Alle Antworten
-
Hallo!
Wenn ich das richtig sehe, dann ist "this" in dem aufrufenden Kontext ein Zeiger auf den Dialog CProjectDlg. Mit dem eigenen Konstruktor wird aber ein CView-Object verlangt. Der Aufruf müsste meiner Meinung also eher so etwas wie m_pPrgActivities = new CPrgActivities( m_pView ) sein, wobei m_pView ein Attribut des aufrufenden Dialogs sein muss. Kommentiert man den Standardkonstruktor aus, dann wird versucht, aus dem CDialogEx ein CView zu machen, was natürlich nicht geht...
Christoph Hermanns, Nürnberg -
Wo der Fehler ist weis ich jetzt, danke erst mal. Doch wie ich eslöse versteh ich noch nicht so ganz:
Muss ich in CProjectDlg eine Variable
CPrgActivities m_pView
definieren und dann
m_pPrgActivities = new CPrgActivities( m_pView )
in den Konstruktor von CProjectDlg hinein schreiben?
VisualCPlusPlus -
Wo bitte erzeugst Du Deinen Dialog?
this ist eben an dieser Stelle kein View Zeiger sondern ein Dialog.Wenn Du aus einem Dialog einen anderen Dialog erzeugst und einen View Zeiger mitgeben willst, dann musst Du diesen View Zeiger auch an den ersten Dialog weitergeben.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert KK Senior Montag, 1. August 2011 14:17
-
- Als Antwort vorgeschlagen Holger M. Rößler Montag, 1. August 2011 14:52
- Nicht als Antwort vorgeschlagen Holger M. Rößler Montag, 1. August 2011 14:52
-
im Konstruktor des Dialogs wird dem Member CView* m_pView der Wert von dem Übergebenen Zeiger pView zugewiesen. Immer wenn der Dialog mit dem Übergeordneten Fenster kommuniziert sieht das in etwa so aus:
m_pView->PostMessage(WM_GOODBYE, IDCANCEL);Das habe ich immer nur von einem Beispiel abgeschrieben und immer mehr Modifiziert. Wozu der Zeiger da ist weis ich nicht so recht. bloß es muss ja einen zweck haben, im Übergeordneten Fenster übergebe ich ja this, da das Beispiel den Dialog von CView aus aufruft funktioniert das dort ja auch.
Meiner meinung nach wird mit this dem Dialog gesagt das er auf der Basisklasse (CView) gezeichnet wird. Aber ich weiß es nicht.
VisualCPlusPlus -
-
Meine Grundidee war es in dem Dialog Informationen für den Benutzer anzuzeigen. Also wenn man an einem Slider die Position ändert, wird in dem Dialog angezeigt was die folgen sind.
Danke für die Hilfe, der Nicht-Modale Dialog funktioniert jetzt endlich.
VisualCPlusPlus