SDI und CFormView



  • ich bräuchte nochmal kurz hilfe, da ich hier n bischen in der Luft hänge. Also ich kenn das aus delphi noch ganz easy mit der dynamischen erstellung von Formularen. Ich habe jetzt in einer normalen SDI-Anwendung eine neue CFormView-Klasse erzeugt (CForm) und möchte davon eine Instanz (Form1) nutzen, welche ich in meiner Applikation z.B. gleich nach dem Initialisieren erzeugt wird. Und natürlich beim Schließen des Programms auch wieder freigegeben wird. Kann ja eigentlich nicht so schwer sein.

    Aber wenn ich nun für CMyNewApp oder CChildView durch "Add Member Variable" eine neue Variable vom Type CForm anlegen und das compilieren möchte, mekkert der Compiler gleich los.

    Wie funktioniert das nur richtig? kann mir jemand hierbei nochmals helfen?



  • Wenn du den VC Wizard nutzt, kannst du auf der letzten Seite im Wizard sagen welche View er verwenden soll.
    Per Hand kann ich das hier leider nicht aus dem Stehgreif.



  • ..möglichst per hand, ich möchte mehrere FormViews in der App verwenden.
    (wie gesagt in delphi ist das für mich alles kein ding, aber unter VC++ seh ich noch nicht recht durch)



  • Rio1 schrieb:

    ..möglichst per hand, ich möchte mehrere FormViews in der App verwenden.
    (wie gesagt in delphi ist das für mich alles kein ding, aber unter VC++ seh ich noch nicht recht durch)

    Zum nutzen mehrere View in einer SDI Anwendung schau hier http://www.c-plusplus.net/forum/viewtopic-var-t-is-81908.html



  • Nutzt du in deinem Programm auch die CDocument Klasse?



  • das FAQ hab ich schon gesehen, versteh davon leider noch nicht viel (scheitert schon z.B. bei template - weiss auch nicht ob eVC++ das kann)

    ich möcht ja jetzt erst einmal nur ein Form dynamisch erzeugen als 1. Schritt.

    CDocument/CView nutz ich nicht.



  • Wenn ich zuhause bin kann ich es dir sagen. Dauert noch ca. 1 - 1 1/2 std.



  • kein problem.



  • Die Standard Codezeilen in der InitInstance in dem App Objekt sieht folgender Maßen aus:

    BOOL CTestmeApp::InitInstance()
    {
    	AfxEnableControlContainer();
    
    	// Standardinitialisierung
    	// Wenn Sie diese Funktionen nicht nutzen und die Größe Ihrer fertigen 
    	//  ausführbaren Datei reduzieren wollen, sollten Sie die nachfolgenden
    	//  spezifischen Initialisierungsroutinen, die Sie nicht benötigen, entfernen.
    
    #ifdef _AFXDLL
    	Enable3dControls();			// Diese Funktion bei Verwendung von MFC in gemeinsam genutzten DLLs aufrufen
    #else
    	Enable3dControlsStatic();	// Diese Funktion bei statischen MFC-Anbindungen aufrufen
    #endif
    
    	// Ändern des Registrierungsschlüssels, unter dem unsere Einstellungen gespeichert sind.
    	// ZU ERLEDIGEN: Sie sollten dieser Zeichenfolge einen geeigneten Inhalt geben
    	// wie z.B. den Namen Ihrer Firma oder Organisation.
    	SetRegistryKey(_T("Local AppWizard-Generated Applications"));
    
    	LoadStdProfileSettings();  // Standard INI-Dateioptionen laden (einschließlich MRU)
    
    	// Dokumentvorlagen der Anwendung registrieren. Dokumentvorlagen
    	//  dienen als Verbindung zwischen Dokumenten, Rahmenfenstern und Ansichten.
    
    	CSingleDocTemplate* pDocTemplate;
    	pDocTemplate = new CSingleDocTemplate(
    		IDR_MAINFRAME,
    		RUNTIME_CLASS(CTestmeDoc),
    		RUNTIME_CLASS(CMainFrame),       // Haupt-SDI-Rahmenfenster
    		RUNTIME_CLASS(CTestmeView));
    	AddDocTemplate(pDocTemplate);
    
    	// Befehlszeile parsen, um zu prüfen auf Standard-Umgebungsbefehle DDE, Datei offen
    	CCommandLineInfo cmdInfo;
    	ParseCommandLine(cmdInfo);
    
    	// Verteilung der in der Befehlszeile angegebenen Befehle
    	if (!ProcessShellCommand(cmdInfo))
    		return FALSE;
    
    	// Das einzige Fenster ist initialisiert und kann jetzt angezeigt und aktualisiert werden.
    	m_pMainWnd->ShowWindow(SW_SHOW);
    	m_pMainWnd->UpdateWindow();
    
    	return TRUE;
    }
    

    Wichtig hier von sind die Zeilen

    CSingleDocTemplate* pDocTemplate;
    	pDocTemplate = new CSingleDocTemplate(
    		IDR_MAINFRAME,
    		RUNTIME_CLASS(CTestmeDoc),
    		RUNTIME_CLASS(CMainFrame),       // Haupt-SDI-Rahmenfenster
    		RUNTIME_CLASS(CTestmeView));
    	AddDocTemplate(pDocTemplate);
    

    da du hiermit festlegst welches Fenster, welche View und welches Dokument geladen werden soll.



  • ok, ich habe zwar kein Doc/View benutzt, aber wie kann ich nun in dem Mainframe am besten ein neues Form (CForm z.B. mit IDD_FORM_FORM Ressource) dyn. erzeugen / einbinden und anzeigen lassen?

    ich probiers so:

    CMainFrame* pFrame = new CMainFrame;
    ..
    ..
    ..
    ..
    pFrame->UpdateWindow();
    
    CForm* pForm = new CForm;  // Fehler!
    ..
    pForm->ShowModal(SW_SHOW);
    ..
    //delete pForm;
    
    return TRUE;
    
    errorC2248: CForm::CForm : cannot access protected member declared in class 'CForm'
    

    in delphi geht das so einfach, und bei den Microsoft Produkten ist alles verkompliziert 😡 Ich hab jetzt auch mal das CFormView als Basisklasse im Projekt festgelegt. Na toll da hab ich ein vorgefertigtes Formular, auf dem ich was machen kann. Aber wo das erzeugt und freigegeben wird, ist nirgendswo zu finden.

    es muss doch einfach möglich sein zur laufzeit mehrere formular zu erzeugen und wieder freizugeben!! 😕 Mache ich die Konstruktoren/Destruktoren von Form.h von protected auf public, wird zwar kompiliert aber auch kein Formular angezeigt. so langsam verzweifel ich.



  • Eine SDI Anwendung kann standardmäßig nur ein Formular haben (Dialoge ausgeschlossen). Die musst du per Code wechseln. Hierfür gibt es in der FAQ ein Beispiel dafür.
    Schau dir mal das hier an, vielleicht hilft es dir ein wenig weiter.
    http://mitglied.lycos.de/guenni1981/adressbuch/


Anmelden zum Antworten