gemein.. Geht es nicht aus einer Dialogklasse auf die DOC-Klasse zuzugreifen?



  • Grüsst euch!

    Ich brauche dringend Hilfe, sicher ist diese Thematik schon einige male angesprochen worden, aber ich habe bis jetzt keine Lösung für folgendes Problem gefunden:

    Also ich hab ein MFC (SDI) Projekt zur Anwendung. In der besagten DOC-Klasse habe ich eine Funktion zum Datei laden (mit CFileDialog), in einer Membervariable steht mir der vollständige Pfad zur gewählten Datei zur Verfügung.
    Zusätzlich habe ich noch ein custom-dialog in der ich die ausgewählte datei weiter verarbeiten will. Soweit ok.

    Funktion in der CToolDoc:
    
    CFileDialog* ldBitmap = new CFileDialog(TRUE, ".bmp", m_strBitmap, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
    	if (ldBitmap->DoModal() == IDOK)
    	{
    		// Dateiname ermitteln
    	m_strBitmap = ldBitmap->GetPathName();
            ...
    

    In m_strBitmap befindet sich der Pfad, ist vom typ cstring und ist public.
    Nun kommt mein Problem:
    -------------------------------------------------------------------------------
    Ich kann nicht auf die Variable, welche sich in der DOC-Klasse befindet, von der Dialogklasse aus zugreifen (muss die pfadvariable nur auslesen).
    -------------------------------------------------------------------------------

    Reiße mir schon die Haare aus, um diese verdammte Variable zu bekommen.
    z.b. schlug eine angelegte getter-Methode fehl. --> problem es ändert sich ja die variable zur laufzeit.

    Funktion in CDialogTool:
    
    	CHufftestDoc *pb = new CHufftestDoc;
    
    	AfxMessageBox("Bitmap-pfad: " + pb->getPath(), MB_ICONINFORMATION, MB_OK);
    

    Problem liegt wohl an dieser DOC-Klasse vom DOC/VIEW konzept, da elemente protected sind usw.. gibt es umwege? andere methoden? techniken? speziell für diese doc-klasse?

    Lange Rede kurzer Sinn: Ich brauche den Pfad der Datei in der Dialogklasse. 🙂

    Ich wäre für jeden Rat Dankbar, es geht um eine Belegaufgabe.



  • Rufst du den Dialog vom Doc aus auf?
    Dann gib den Pfad einfach vor DoModal rüber.



  • Erdnuss schrieb:

    Funktion in CDialogTool:
    
    	CHufftestDoc *pb = new CHufftestDoc;
    
    	AfxMessageBox("Bitmap-pfad: " + pb->getPath(), MB_ICONINFORMATION, MB_OK);
    

    Damit erzeugst du ein neues CDoc-Objekt, das mit deinem existierendem Dokument überhaupt nichts zu tun hat - richtigerweise müsstest du dir per AfxGetMainWnd()->GetActiveDocument() die Adresse des aktiven Dokuments beschaffen.

    (siehe im Magazin)



  • Danke, leider funktioniert es noch nicht.

    Genau estartu, ich rufe den Dialog in der DOC-Klasse über DoModal() auf.
    Wie kann ich aber nun eine Variable (den pfad), an die Dialogklasse mit übergeben?

    @CStoll: Jepp. Ahh stimmt muss auf das aktive Dokument zeigen. Doch der Compiler beschwert sich, das GetActiveDocument kein Element von CWnd sei.

    😕



  • hier nochmal das verwendete Konstrukt (für SDI ?):

    C...Doc* pDoc = dynamic_cast<C...Doc*>((CMainFrame*)AfxGetMainWnd()->GetActiveDocument());
    ASSERT(pDoc);
    

    --> Compiler: "... 'GetActiveDocument': Ist kein Element von 'CWnd' "

    M$ will das man sich in ihr System reinpresst, verflixt. Logischerweise hat die ViewKlasse Zugriff auf die DOC. Gibt es vielleicht auch ein Umweg?



  • Kann es sein, daß in dem Artikel die Klammerung falsch gesetzt ist?

    C...Doc* pDoc = dynamic_cast<C...Doc*>((CMainFrame*)AfxGetMainWnd())->GetActiveDocument();
    

    Andernfalls zu dem Ansatz, den Estartu vorgeschlagen hat:

    class CMyDialog : public CDialog
    {
    public:
      void SetDoc(CMyDoc* doc) {m_doc=doc;}
      ...
      void OnWhatever()
      {
        int test = m_doc->testvar;
        ...
      }
    private:
      CMyDoc* m_doc;
    }
    
    void CMyDoc::OnButton()
    {
      CMyDialog dlg;
      dlg.SetDoc(this);
      dlg.doModal();
      ...
    }
    


  • CStoll schrieb:

    Kann es sein, daß in dem Artikel die Klammerung falsch gesetzt ist?

    C...Doc* pDoc = dynamic_cast<C...Doc*>((CMainFrame*)AfxGetMainWnd())->GetActiveDocument();
    

    *imbodenversink*
    Du hast Recht... das wurde schon öfters gefragt und ich habs nie gesehen. 😞
    Ich ändere das gleich mal, danke. 👍



  • Danke euch! Es gibt noch einen kleinen Umweg um das Prolem zu lösen.

    Folgendes (SDI): In der Applikationsklasse *App baut man sich eine Funktion, um die Datei zu laden und zu speichern mit dem FileDialog. Eine getter-Methode um den Pfad zu erhalten und externe Implementierung der Klasse mit "extern"

    (beziehe mich auf mein problem, gilt für jede variable)

    in header-datei von *App:
    
    extern CHuffmanToolApp theApp;
    
    in der Klasse von *App:
    
    void C...App::OpenFromApp()
    {
    	...
    	// Dialogfeld Datei öffnen (Bitmap)
    	CFileDialog* ldFile = new CFileDialog(TRUE, ".bmp", m_strOrgFile, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
    
    	CString selectPath = theApp.GetProgPath() + "\\Work";
    
    	ldFile->GetOFN().lpstrInitialDir = selectPath;
    
    	if (ldFile->DoModal() == IDOK)
    	{
    		m_strOrgFile = ldFile->GetPathName();
    		m_strFileExt = ldFile->GetFileExt();
    		m_strFileName = ldFile->GetFileName();
    	}
    
    	delete ldFile;
    }
    
    CString C...App::GetPathName()
    {
    	return m_strOrgFile;
    
    }
    

    Nun kann mittels der getter-Methode von überall aus, sich die Werte der variablen holen.

    Im Falle des Beispiels:

    void IrgendEineKlasse::OnFileopen()
    {
    	theApp.OpenFromApp();
    	CString m_strFile = theApp.GetPathName();
            ....
    

    Im Endeffekt kann man von überall aus auf die Applikationsklasse zugreifen.



  • 😕 Warum basteln sich die Leute immer irgendwelche Hilfslösungen, nachdem man ihnen die systemeigenen Möglichkeiten gezeigt hat?



  • CStoll schrieb:

    😕 Warum basteln sich die Leute immer irgendwelche Hilfslösungen, nachdem man ihnen die systemeigenen Möglichkeiten gezeigt hat?

    Entweder, weil sie nicht nochmal ins Forum geguckt haben - oder weil man ja irgendwas zum Lachen/Fluchen braucht, wenn man in einigen Jahren den Code nochmal anschaut. 😉
    Ich will da ein bestimmtes Programm von mir gar nicht mehr angucken... 😃


Anmelden zum Antworten