Zu Hülf: Ändern Dialogfelddaten vom "child"-Dialog aus

Marcus2k

Grünschnabel
Hallo zusammen,

folgendes Problem: Ich habe für meine Arbeitskollegen und mich ein auf unsere Bedürnisse zugeschnittenes Protokoll programmiert und bin jetzt dabei, eine Suchfunktion zu implementieren. Die Suche ist als nicht-modaler Sub-Dialog realisiert. Nun möchte ich, daß, sobald man auf die in einer Listbox aufgeführten Ergebnisse eines Suchlaufs klickt, der dazugehörige Tag in den Hauptdialog geladen wird. Der zuvor angezeigte "Protokoll"-Tag soll aber zuvor(!) im Hintergrund abgespeichert werden.

Hier die Crux: Ich rufe mittels parent-Zeiger die "SaveToFile"-Methode des Hauptdialogs auf, erhalte dann aber eine Access Violation. Es sieht für mich so aus, als würde in den Dialogfeld-Membern nur noch Müll stehen bzw. als ob sie nicht mehr sauber ansprechbar wären. Sobald ich aber den Such-Dialog beende, kann ich ganz normal im Hauptdialog weiterarbeiten.

Weiß jemand Rat?

Gruß
Marcus
 
Zuletzt bearbeitet:
Schwer zu sagen, ist dein Parent überhaupt der Hauptdialog?

Übergib doch einfach im Constructor den Pointer auf den Hauptdialog, dann kannst du nach Herzenslust darauf zugreifen.
 
Hallo Endurion,
ja, es ist der Hauptdialog. Und der Zugriff ist ja eigentlich nicht das Problem: Diese SaveToFile-Methode, die ich vom Suchdialog aus aufrufe, wird etwa auch dann ausgeführt, wenn der Benutzer auf den Speichern-Button im Hauptfenster klickt.
Doch solange der Such-Subdialog existiert, scheint es Probleme mit den Membervariablen des Hauptdialogfeldes zu geben. Ich denke nicht, daß das so sein soll; ich befürchte, es handelt sich um Seiteneffekte, aber ich kann mir nicht erklären, wie diese zustande kommen.

Gruß
Marcus
 
Zuletzt bearbeitet:
Ist das eine dialogbasierte Applikation? Dann kommst du nämlich auch mit AfxGetMainWnd() an den Hauptdialog heran.

Gruß
MCoder
 
Hallo MCoder,

danke für den Tipp, aber das ist nicht das eigentliche Problem.Vielleicht hab ich mich mißverständlich ausgedrückt:
Die Methode SaveToFile() übernimmt das Abspeichern der Protokolldaten und ist Teil des Hauptdialoges. Wenn ich jetzt aber vom Suchdiaog aus dieselbe Methode aufrufe (das mach ich z.Z. indem ich mir GetParentOwner() eine Zeiger auf den Hauptdialog hole, und das funktioniert ja auch), steht in den Membervariablen nur noch Müll. Bspw. gibt es die Variable m_ProtData vom Typ CString, die die in ein Textfeld eingebenen Daten enthält. Vor Aufruf des Suchdialogs tut sie dies auch. Aber wenn ich SaveToFile() aufrufe, während der Suchdialog existiert, enthält sie scheinbar zufälligen Datenschrott.

Gruß
Marcus
 
Hallo Marcus,

hast du mal versucht zu analysieren, an welcher Stelle in SaveToFile() was schiefgeht? Stimmen denn die Variablen noch, wenn du vom SuchDialog aus in diese Funktion hereingehst?

Marcus2k hat gesagt.:
danke für den Tipp, aber das ist nicht das eigentliche Problem
Auszuschließen ist es nicht. Manchmal ist es auch wichtig, wie man sich den Zugriff auf ein Objekt holt, wenn z.B. Threads ins Spiel kommen.

Gruß
MCoder
 
MCoder hat gesagt.:
Hallo Marcus,
Stimmen denn die Variablen noch, wenn du vom SuchDialog aus in diese Funktion hereingehst?
Genau das ist es: Es liegt nicht an der Funktion; die habe ich nur als Beispiel genannt, weil ich gerade sie auzuführen versuche.Die Methode an sich arbeitet sauber. Aber die Daten, also sämtliche Variablen des Hauptdialogs, enthalten aus irgend einem Grund nur noch Schrott. Ich hab noch immer nicht rausfinden können, woran das liegt

Gruß
Marcus
 
Hast du mal versucht, dir den Zeiger zum Hauptdialog auf andere Weise als mit "GetParentOwner()" zu holen?
 
Ich fass' es nicht! Mit AfxGetMainWnd() funktionierts. Ich hab lediglich die Funktionsaufrufe ersetzt, und jetzt läuft es.
Bin ja ganz happy darüber, aber nachvollziehen kann ich das nicht. Beide Funktionen liefern doch einen Pointer auf das Parent-Window. Wo ist der Unterschied?

Auf jeden Fall schon mal vielen Dank! :)
 
Dann ist das GetParent() vom nicht-modalen Dialog nicht das Hauptfenster mit den Variablen. Bei MFC sind immer wieder einige Extra-Fenster im Spiel.

Aus dem Grunde baue ich mir üblicherweise meine quasi-globalen Variablen in die theApp-Variable und greife dann über theApp.m_... darauf zu. Wenn man sich auf GetParent()-Konstellationen verlässt, klappt das nicht mehr, wenn man Fenster in der Hierarchie umsortiert.

Das AfxGetMainWnd() ist in etwa dasselbe wie ein Zugriff auf theApp.
 
Zurück