none
Nichtmodalen Dialog erstellen, falscher Konstruktor wird benutzt RRS feed

  • 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
    Dienstag, 26. Juli 2011 17:30

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
    Sonntag, 31. Juli 2011 15:44
    Moderator

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
    Donnerstag, 28. Juli 2011 18:35
  • 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
    Samstag, 30. Juli 2011 15:51
  • 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
    Sonntag, 31. Juli 2011 15:44
    Moderator
  • Also muss ich von meiner Basisklasse CView, CProjectDlg mit einem CView-Zeiger aufrufen um anschließend aus CProjectDlg, CPrgActivities mit dem CView-Zeiger aus meiner Basisklasse, zu starten?
    VisualCPlusPlus
    Sonntag, 31. Juli 2011 16:10
  • Das, oder Du besorgst Dir den View Zeiger über das SDI Interface.
    Über AfxGetMainWnd und GetActiveView...

    Aber warum benötigt ein Dialog einen View Zeiger?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Sonntag, 31. Juli 2011 17:49
    Moderator
  • 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
    Sonntag, 31. Juli 2011 18:03
  • Ich verstehe noch nicht was der Sinn des Dialoges ist, aber this ist immer nur der Zeiger auf das aktuelle Objekt. Im CView ist this ein View, im CDialog eben der aktuelle Dialog.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Sonntag, 31. Juli 2011 19:39
    Moderator
  • 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
    Montag, 1. August 2011 16:34