Übergabe Membervariable an andere KLasse
-
Hallo,
hoffe Ihr könnt mir helfen.
Habe jetzt schon mehrfach das Forum durchsucht, aber leder nix passendes gefunden.Ich habe eine Klasse CAnalyze in der eine Analyse durchgeführt wird. Das Ergebnis schreibe ich in einen CString m_cstrDump.
Jetzt will ich in meiner MDI-Anwendung das ganze in einer von CEditView abgeleiteten Klasse ausgeben. Hab das erstmal so versucht (CTabkomplettdump ist die von CEditView abgeleitete Klasse):void CTabKomplettDump::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) { // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen //CAnalyze dump; //SetWindowText(dump.m_cstrDump); }
Mir ist schon klar, dass das so nicht funktionieren kann, wollte nur verdeutlichen, was ich vorhabe.
Wär sehr dankbar wenn mir jemand helfen würde.
-
Wo lässt du die Analyse machen? Wo ist der Aufruf dafür?
-
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()?"