Datenexport von Dialogfenster in Dokumentenklasse
-
Von wo rufst du den Dialog denn auf? Aus dem Doc wäre optimal, alles andere kriegen wir auch hin.
Die Zeilen werden übrigens böse in die Hose gehen (Zugriff auf Zeiger ohne was dahinter).
-
Also erstmal werde ich meine letzte Aussage korrigieren
int u = pDateninput->Wert.GetSize();
da Wert in meinem Fall ein CStringArray ist.
Ich habe ja mehrere Dokumente. Es wird dadurch vom Assistenten ein ChildFrm und ein MainFrm erstellt. In jedem Frame habe ich einen Gliederungspunkt geschaffen ( "Eingabedialog öffnen")
In den MainFrm mache ich dann eine Funktion in der Art:
void CMainFrame::OnEingabedlg() { CDateneingabe dlg; //CDateneingabe ist die Dialogfeldklasse dlg.DoModal(); }
Auf diesem Dialog ist bis jetzt nur ein Button für Datei einlesen - was auch wunderbar funzt. Die Werte werden dann in eine öffentliche Membervariable vom Typ CStringArray geschrieben.
Nun soll die weitere Verarbeitung in der Dokumentenklasse stattfinden(sollte ja eigentlich so sein, wegen einer besseren Strukturierung). Wie wird aber jetzt meine Funktion zur Berechnung in der Dokumentenklasse aufgerufen?cu
-
Ist das Dokument das aktive? Dann gibt es bei der SDI GetActiveDocument - für MDI musste leider selber gucken.
Dann gibst du das Array einfach als Parameter der Berechnen-Funktion.
-
Also ich dachte das funktioniert so:
Ich arbeite in meinem Dialogfeld, da werden dann meine Werte eingelesen. Wenn nun der Button OK gedrückt wird, ist ja wieder das zu Beginn geöffnete Dokument aktiv.Was meinst du mit
estartu_de schrieb:
Dann gibst du das Array einfach als Parameter der Berechnen-Funktion.
?
Ich komme doch im Moment gar nicht bis zu dieser Funktion da sie nicht aufgerufen wird.
-
Naja, Variablenübergabe funktioniert im Prizip wie Staffellauf.
Der Dialog hat was. Das kann er dem Mainfrage geben. Der kann das ans Doc geben.
Direkt vom Dialog zum Doc geht nicht, weil die sich nicht kennen.Naja, wenn die Funktion nicht aufgerufen wird, dann ruf sie doch auf.
Oder geht das nicht? Dann gib das Array nur ans Doc und das speichert das dann zwischen für die spätere Verwendung, wenn dann die Funktion aufgerufen wird.
-
Dann muss ich aber in all diesen Klassen diese Membervariablen deklarieren, sonst sagt er "nichtdeklarierter Bezeichner" ?
Ich habe in meinen Doc die Header Datei der Dialogfeldklasse eingebunden. Über die Zeilen die ich vorhin geschrieben habe, rufe ich dann diese Werte ab.
Ich muss also um überhaupt rechnen zu können, in den Frame einen Punkt "Berechnungen" einbringen, der dann diese Funktion aufruft, die im Doc ist , und auf die Werte aus den Frame zugreift?
-
Ich fürchte, du hast mich nicht verstanden.
Lies bitte mal:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-103523.html
-
Also kurz nach mal skizziert:
In meinen Frame hab rufe ich die Funktion "OnEingabedlg" auf. In dieser Dialogfeldklasse (CDateneingabe) werden die Ergebnisse in öffentlich Membervariablen gespeichert.
Rufe ich nun in meinen Frame die nächste Funktion auf ("Berechnung"), dann verwendet diese einen Zeiger um auf die Membervariablen der anderen Klasse zuzugreifen. Ist das richtig?Wofür brauche ich dann übehaupt die Dokumentenklasse? Wenn ich z.B. in meine Klasse CChildFrm den Header der CDateneingabe.h mit einbinde müsste ich zugriff darauf haben. Da ist doch der Schritt über die Dokumentenklasse überflüssig, oder liege ich jetzt völlig daneben?
-
roeschti schrieb:
Also kurz nach mal skizziert:
In meinen Frame hab rufe ich die Funktion "OnEingabedlg" auf. In dieser Dialogfeldklasse (CDateneingabe) werden die Ergebnisse in öffentlich Membervariablen gespeichert.
Soweit ist es okay.
roeschti schrieb:
Rufe ich nun in meinen Frame die nächste Funktion auf ("Berechnung"), dann verwendet diese einen Zeiger um auf die Membervariablen der anderen Klasse zuzugreifen. Ist das richtig?
Jein. Du hast das hinter dem Link gelesen?
Also, Du hast deinen Dialog, der irgendwo ein wenig Speicher belegt und da ist auch das gefüllte Array.
Wenn du nun im Doc einfach einen Zeiger machst, dann zeigt der ja ins Nirvana, aber NICHT auf den Speicherplatz, wo der Dialog zu finden wäre. (Im Beispiel würdest du jetzt versuchen, mit dem Parkplatz loszufahren.)
Du musst also das Array weitergeben über Instanzen, die sich kennen. (s.o.)Jetzt besser?
-
Und diese Instanz wird in dem Document erzeugt?
Also in der Art:CDateneingabe Wert1, Wert2;
Wenn ich dann aus dem ChildFrm zugreifen möchte mache ich
Wert1.variable1 //variable1 ist eine öffentliche Membervariable der Klasse CDateneingabe
vorrausgesetzt die Doc.h ist eingebunden?
??Jetzt besser?
-
Nicht wirklich.
Also, eine Möglichkeit wäre:
Vom Frame aus die Funktion im Doc aufrufen.
Die ruft den Dialog auf, danach kannst du das Array abfragen.
-
Nochmal zwei Schritte zurück. Du sagtest, das Array wird über Instanzen weitergegeben die sich kennen. Wie kann ich so was machen? Also wo musss ich was wie deklarieren?
Damit meine Funktion zur Berechnung überhaupt aufgerufen wird, habe ich sich in eine Funktion der Klasse ChildFrm geschrieben. In meinen Doc steht jetzt nichts mehr drin
Nicht das wir aneinander vorbeireden - kann ich dir es vielleicht per mail schicken?
cu
-
Naja, wenn die jetzt schon im Childframe steht, dann hast du es doch fast geschafft.
Jetzt musst du nur noch einen Zeiger auf den Dialog der Funktion geben. Die kann dann den Zeiger verwenden um die Daten auszulesen.
Also:
CDateneingabe dlg; dlg.DoModal(); Berechne(&dlg);
-
Ich habe einen Frame: In diesem Frame gibt es einen Punkt GPS, zu diesem noch zwei Unterpunkte (Eingabedialog öffnen und Streckenverlauf)
Wenn ich nun Eingabedialog öffnen wähle, öffnet sich ein Dialogfenster. Darin werden Daten in ein CStringArray eingelesen. Anschließend wird der Dialog mit OK beendet.
Die Daten sollen nun in einer weiteren Funktion berechnet und anschließend in dem geöffneten Dokument grafisch dargestellt werden. Zur besseren Übersichtlichkeit wollte ich die Funktion (Funktion trägt den Namen F_Berechnung) in die Dokumentenklasse schreiben, und die grafische Darstellung in die View-Klasse.
Wähle ich also danach in diesem Frame unter GPS den Punkt Streckenverlauf, so muss diese Funktion (z.B OnStreckenverlauf) dann die Berechnungen durchführen. Sie muss also dann die zuvor in dem Dokument geschriebene Funktion F_Berechnungen aufrufen.Das mit dem doModal funktioniert also schon. Die Daten sind nun in meiner öffentlich Membervariable der Dialogklasse. Nun muss ich also Instanzen erzeugen, um auch aus der Dokumentenklasse daraufgreifen zu können.
Ich hoffe die Situation jetzt nochmal eindeutig dargestellt zu haben
-
Nun muss ich also Instanzen erzeugen...
du hast doch schon eine.
Also, ich habe jetzt mal geguckt, GetActiveDocument funktioniert auch für eine MDI. Du kannst die Funktion also nutzen, mit der kommst du von Frame aus an dein Dokument.
Schau mal, was man nettes in der MSDN dazu findet:CMDIChildWnd * pChild = ((CMDIFrameWnd*)(AfxGetApp()->m_pMainWnd))->MDIGetActive(); if ( !pChild ) return NULL; CDocument * pDoc = pChild->GetActiveDocument(); if ( !pDoc ) return NULL; // Fail if doc is of wrong kind if ( ! pDoc->IsKindOf( RUNTIME_CLASS(CMyDoc) ) ) return NULL; return (CMyDoc *) pDoc;
Denk mal in Ruhe drüber nach und wenn du nicht weiter weißt, schicks an mail@estartu.de
Vor Morgen früh komme ich aber nicht dazu.
-
Danke erstmal, werd mal ne Nacht drüber schlafen. Aber ich denke jetzt geht es in die richtige Richtung
OK, dann vielleicht bis morgen
cu