Übergabe Membervariable an andere KLasse
-
Das mache ich in der Doumentenklasse
BOOL CDatenAnalyzerMDIDoc::OnOpenDocument(LPCTSTR lpszPathName) { if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; CAnalyze analyze; analyze.Analyze(m_cstrFilePath); UpdateAllViews(NULL); return TRUE; }
-
Du kannst den String dem UpdateAllViews mitgeben. Ich weiß aber nicht mehr wie und zum selber ausprobieren fehlt mir gerade die Zeit.
Das wäre wohl das sauberste.Es gibt noch die Möglichkeit, den String im Doc zu speichern und dann vom View aus über GetDocument wieder abzufragen. Dabei kann ich dir dann auch helfen.
-
Werde wohl eher mal die zweite Variante ausprobieren. Was bei mir erschwerender Weise nämlich noch dazu kommt, ist dass ich mehrere Views habe, da ich mit Splittern und Tabs arbeite, die dann alle aktualisiert werden müssen.
Hab jetzt eine Menembervariable in mein Doc eingefügt, die den CString übernimmt:m_cstrComplete = analyze.Analyze(m_cstrFilePath);
Wie funktioniert das dann genau mit dem GetDocument? Würd gerne auf dein Hifeangebot zurückkommen.
-
Hat dein View kein GetDocument? (Bei Splittern bin ich mir nicht sicher...)
WENN er hat guck mal, was er zurückgibt. Dann weiß ich, ob du noch casten musst.
Wenn nicht nehmen wir einfach AfxGetMainWnd()->GetActiveDocument().
-
Hoffe ich hab dich richtig verstanden.
Wenn ich in meinem CEditView GetDocument() aufrufe gibt der mir einen CDocument* Pointer zurück.
-
Du hast mich richtig verstanden.
Gut, dann muss man den Zeiger noch casten. Das geht mit
CDatenAnalyzerMDIDoc* pDoc = dynamic_cast<CDatenAnalyzerMDIDoc*>(GetDocument()); ASSERT(pDoc); // Wenns schiefgegangen ist, ist der Zeiger NULL.
Für den Cast musst du wahrscheinlich noch RTTI einschalten:
Projekteinstellungen -> C/C++ -> Programmiersprache C++ -> mittleres Häkchen setzenOkay?
-
Krieg folgende fehlermeldung:
error C2680: 'class CDatenAnalyzerMDIDoc *' : Ungueltiger Zieltyp fuer dynamic_cast
-
Hast du den Code rauskopiert oder abgeschrieben? Wenn du ihn abgeschrieben hast, zeig nochmal.
Ansonsten versuch stattdessen:
CDatenAnalyzerMDIDoc* pDoc = dynamic_cast<CDatenAnalyzerMDIDoc*>(AfxGetMainWnd()->GetActiveDocument()); ASSERT(pDoc); // Wenns schiefgegangen ist, ist der Zeiger NULL.
-
Hab den Code rauskopiert. Bei dem neuen krieg ich ne andere Fehlermeldung:
error C2039: 'GetActiveDocument' : Ist kein Element von 'CWnd'
-
Ach, du hast je eine MDI - das was ich da gemacht habe, hab ich nur in SDIs getestet.
So, jetzt habe ich mir ein Testprojekt erstellt. Und die Getdocument sieht so aus:
CTest_mdiDoc* CTest_mdiView::GetDocument() { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTest_mdiDoc))); return (CTest_mdiDoc*)m_pDocument; }
Versuch die in deinem View mal entsprechend anzupassen.
-
Also in der View hab ich auch schon die GetDocument drin und die sieht so aus:
CDatenAnalyzerMDIDoc* CDatenAnalyzerMDIView::GetDocument() // Die endgültige (nicht zur Fehlersuche kompilierte) Version ist Inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDatenAnalyzerMDIDoc))); return (CDatenAnalyzerMDIDoc*)m_pDocument; }
Die CEditView Klasse, an die ich meine Variable übergeben will ist ja aber nur ein Teil von der ganzen View (eine Registerkarte in einem Splitter).
-
Ich steig durch den MDI-Kram nicht durch.
Man müßte sich doch irgendwie rüberhangeln können, aber ich finde es nicht.
Kommst du vom Doc zum View? Dann könntest du es vorher rübergeben.Ansonsten bin ich jetzt echt ratlos. Ich hatte mal Code dafür, aber ich finde ihn nicht mehr.
-
Vielen Dank auf jeden fall erstmal für deine Zeit und Hilfe.
Werd mir wohl überlegen, ob ich das ganze nicht doch lieber als SDI mache, wenn es da einfacher ist. Ich bin nämlich langsam am verzweifeln an diesem Problem und leider nicht gerade der größte Programmierer
-
Sonst frag doch nochmal unter neuer Überschrift:
"Wie komme ich bei einem MDI vom View zum Doc? oder wie funktioniert UpdateAllViews()?"