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...