Wie kann ich einen Dialog inkl. Dialogklasse vererben?



  • Hallo,

    ich möchte in meinem Projekt einen neuen Dialog erstellen, der Dialog sollte die Memberfunktionen und Schaltelemente eines bereits erstellten übernehmen, plus ein paar Zusätzlich visuelle Elemente bereitstellen.
    Theoretisch müsste das doch per Vererbung machbar sein, oder?

    Die Dialoge sind jeweils Modal, also es kann nur einen aktiven geben...


  • Mod

    - Kopiere den alten Dialog.
    - Dann lege den neuen Dialog ganz normal mit dem Wizard an, ändere die Basisklasse von CDialog einfach auf Deinen anderen zuerst erzeugten Dialog. (Alle Referenzen auf CDialog müssen ersetzt werden!)
    Dann werden alle Handler und Variablen vererbt.
    - Dann legst Du die neuen COntrolelemente an und fügst die neuen Handler hinzu.



  • was mache ich mit dem Konstruktor?
    Der erbt seine Funktion von CDialog und genau da meckert der Compiler, löst zwar auf bis zur Basis CWnd, aber läßt dies nicht zu 🙄



  • Hallo,

    Du musst alle CDialog durch CDieBasisKlasse ersetzen. (siehe auch Post von MR)

    Gruss
    foodax



  • naja, irgendwas stimmt nicht, ich habe Fehlermeldung in der Basisklasse:

    --------------------Konfiguration: testcenter - Win32 Debug--------------------
    Kompilierung läuft...
    testcenterDlg.cpp
    c:\projekte\testcenter\testcenter\multitestdlg.h(23) : error C2504: 'CTestcenterDlg' : Basisklasse undefiniert
    ###compiling for CONSOLE
    c:\projekte\testcenter\testcenter\testcenterdlg.cpp(1259) : error C2039: 'DoModal' : Ist kein Element von 'CMultiTestDlg'
            c:\projekte\testcenter\testcenter\multitestdlg.h(22) : Siehe Deklaration von 'CMultiTestDlg'
    Fehler beim Ausführen von cl.exe.
    
    testcenterDlg.obj - 2 Fehler, 0 Warnung(en)
    

  • Mod

    Glaskugel ist defekt.

    Wie wäre es mit etwas Code von der entsprechenden Source-Datei?



  • Basisklasse undefiniert

    .h File der Basisklasse includiert?



  • @jencas: include ist vorhanden, s.u.

    #include "testcenterDlg.h"
    
    // MultiTestDlg.h : Header-Datei
    //
    
    /////////////////////////////////////////////////////////////////////////////
    // Dialogfeld CMultiTestDlg 
    //class CMultiTestDlg : public CDialog
    class CTestcenterDlg;
    
    class CMultiTestDlg : public CTestcenterDlg
    {
    // Konstruktion
    public:
    	CMultiTestDlg(CWnd* pParent = NULL);   // Standardkonstruktor
    

    Trotzdem meckert er, die Basisklasse sei unbekannt 😕


  • Mod

    Die Vorwärtsgdeklaration class CTestcenterDlg; ist in jedem Falle falsch. Du brauchst die komplette Deklaration der Klasse.

    Dennoch Deine Klasse CTestcenterDlg scheint nicht in testcenterDlg.h zu sein, oder in einem anderen Namespace.



  • Inzwischen läßt sich das Projekt fehlerfrei übersetzen.
    Da hatten sich einige includes gegenseitig behindert, war aber ziemlich blöd zu finden.
    (Die Headerdatei "testcenterdlg.h" enthielt die korrekte Klasse)

    Jetzt habe ich nur noch ein Problem:

    Beim Start wird das Formular der Basisklasse angezeigt, nicht das der abgeleiteten Klasse.
    In der Hauptapplikation wird dennoch die abgeleitete Klasse instanziert und mit DoModal() aufgerufen.
    Apropos (-Idee) Die Controls, müssen die im Assistenten mit der abgeleiteten klasse verbunden werden?

    hmm, er zeigt trotzdem das falsche Formular an, warum?


Anmelden zum Antworten