Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » An Dialogdaten rankommen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
11.05.2003, 17:58 Uhr
Dirk22



Hi,

ich habe folgendes Problem:
Ich habe ein MFC-Programm, welches die Basisklasse CFormView hat. Ich habe ausserdem noch 2 weitere Dialoge. In einer Dialogklasse namens CEinstellungenDlg, gibt es viele Membervariablen.
Und genau auf die Inhalte dieser Membervariablen möchte ich in der Funktion OnClose() der Klasse CMainFrame zugreifen. Aber ich weiss nicht, wie ich von dort aus an die Inhalte der Membervariablen des Dialogs Einstellungen, der in der Klasse CEinstellungenDlg verwirklicht ist, rankomme.

Vielen Dank schon im Voraus für eure Hilfe

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.05.2003, 21:50 Uhr
l3st4rd



du hast nicht gesagt, wo die variable für den dialog deklariert ist, am besten
wäre als public member deiner view-klasse...
falls der dialog ein public member der view klasse ist, kannst du mit folgendem code aus CMainFrame darauf zugreifen:

CMDIChildWnd *pChild = (CMDIChildWnd *) GetActiveFrame();
if (pChild) {
CMyView *pView = (CMyView*) pChild->GetActiveView();
if (pView) {
x = pView->Dialog.Variable;
}
}


daniel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.05.2003, 22:18 Uhr
Dirk22



Hi Daniel,
erst mal vielen Dank für deine Antwort. Leider ist der Dialog kein public member der view Klasse.
Ich werde es etwas genauer beschreiben:
Ich habe ein SDI-Programm, welches von CFormView abgeleitet ist. Auf dem schon von Anfang an dabei gewesenen Dialog habe ich ein Register plaziert.
In der Funktion OnInitialUpdate() habe ich dann festgelegt, dass dieses Register 2 Seiten haben soll. In jeder Seite ist ein Dialog drin. Und an einen von diesen beiden Dialogen will ich von CMainframe rankommen. Den Dialog richtig deklariert habe ich dann wohl in OnInitialUpdate() der View.
Für das Register habe ich die Klasse xctrltab verwendet. So sieht der Code in InitialUpdate() der das Register sozusagen deklariert aus:


C++:
m_register.AddPage(IDD_EINSTELLUNGEN, new CEinstellungenDlg, "Einstellungen");
//m_register ist ein Objekt der Klasse xtabctrl



So habe ich es gemacht. Ich hoffe, dass ihr darauf eine Lösung wisst.

Falls nicht, werde ich einmal das ganze Problem beschreiben:
Wenn man in meinem Programm auf das Kreuz rechts oben klickt, um das Programm zu beenden, dann soll ein Meldungsfenster erscheinen. Deshalb brauche ich auch die Funktion OnClose() der Klasse CMainFrame. In dem Meldungsfenster frage ich nun, ob die Daten, die sich in den Membervariablen der Dialogfeldklasse CEinstellungenDlg befinden gespeichert werden sollen. Bei ja werden sie gespeichert. Bei nein wird das Programm einfach geschlossen.
Bisher habe ich es so gemacht, dass ich in der Funktion OnClose() der Klasse CMainFrame erst ein Meldungsfenster erscheinen habe lassen und nun abgefragt habe, ob ja oder nein angeklickt wurde. Dies klappt ja auch ohne Probleme. Nun will ich aber bei ja auf die Inhalte der Membervariablen der Klasse CEinstellungenDlg zugreifen können, um sie dann in einer Datei zu speichern.

Ich hoffe, dass ihr mir helfen könnt.

Vielen Dank im Voraus
Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.05.2003, 22:41 Uhr
l3st4rd



hmm, ich kenne die xctrltab klasse nicht, entweder sie besitzt eine funktion, um einen zeiger auf den dialog zu bekommen oder du speicherst ihn dir selber.
du könntest deiner FormView klasse eine member variable vom typ CEinstellungenDlg* (hier mal pEinstellungenDlg) hinzufügen und InitialUpdate() folgendermaßen ändern:

pEinstellungenDlg = new CEinstellungenDlg;

m_register.AddPage(IDD_EINSTELLUNGEN, pEinstellungenDlg,
"Einstellungen");
//m_register ist ein Objekt der Klasse xtabctrl

damit speicherst du dir einen zeiger auf den dialog, den du in CMainFrame verwenden kannst, z.B (FormView klasse heisst hier CMyFormView):

CMDIChildWnd *pChild = (CMDIChildWnd *) GetActiveFrame();
if (pChild) {
CMyFormView *pView = (CMyFormView*) pChild->GetActiveView();
if (pView && pView->pEinstellungenDlg) {
x = pView->pEinstellungenDlg->nWert;
}
}

achja, damit das funktioniert musst du in MainFrame.h noch MyDocument.h und MyFormView.h mit einbinden.

hoffe das hilft weiter
daniel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.05.2003, 09:38 Uhr
Dirk22



Vielen vielen Dank. Es funktioniert. Allerdings gibt es noch ein Problem:
Sobald ich in "Mainfrm.h" die beiden folgenden Befehle reinschreibe:


C++:

#include "MyDoc.h"  //nur Beispielnamen
#include "MyFormView.h"  //nur Beispielnamen



dann kommen ein Haufen Fehlermeldungen in der Datei "MyFormView.h" die folgenden Code betreffen:


C++:
public:
    CMyDoc* GetDocument();



Um deinen Code vollständig ausprobieren zu können habe ich die Funktion in der Headerdatei der View und in der Implementierungsdatei der View mal einfach auskommentiert.

Aber diese Funktion ist denke ich schon auch wichtig. Ausserdem wäre es interessant, woran es liegen könnte.

Und dann ist es mir noch sehr wichtig, dass ich diesen Code gut verstehe, damit mir klar wird, wie man von einer Klasse auf eine andere über eine geschickte Zeigerkonstruktion zugreifen kann. Es wäre super, wenn du ein paar Kommentare hinmachen könntest.

Ich hoffe, dass du mir helfen kannst.

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.05.2003, 09:43 Uhr
Dirk22



Vielleicht helfen dir diese Fehlermeldungen weiter. Diese erscheinen, wenn ich die beiden include-Befehle in Mainframe.h eintrage. Aber recht hilfreich finde ich sie nicht.

error C2143: Syntaxfehler : Fehlendes ';' vor '*'
error C2501: Fehlende Speicherklasse oder Typbezeichner
error C2501: 'GetDocument' : Fehlende Speicherklasse oder Typbezeichner

mfg Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.05.2003, 09:58 Uhr
Dirk22



Ich kann dir das Auftreten des Fehlers nun genauer beschreiben. Ich habe gerade ein komplett neues Projekt erstellt. Und habe dann die Headerdatei der View in Mainframe.h eingebunden. Und schon war der gleiche Fehler da. Dein Code ist völlig in Ordnung. Es scheint nur ein Problem zu geben, wenn man die Headerdatei der View in Mainframe.h einbinden will.

Ich hoffe, dass es dafür eine gute Erklärung und vor allem auch eine Lösung gibt.

mfg Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.05.2003, 15:33 Uhr
Volle



Hi Dirk,

vermutlich hast du die Header "rekursiv" eingebunden. Soll heißen, du verweist in beiden Headern jeweils auf den anderen. Das gibt Ärger. Die Lösung ist generell eine Forward- Deklaration und das Einbinden eines der beiden Headers im CPP- File der anderen Klasse.

Gruß, Volle.

P.S.: Ich schreibe includes im Header nur wenn es sich nicht vermeiden läßt, um diesem Problem vorzubeugen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.05.2003, 16:42 Uhr
Dirk22



Hi Volle,

eine forward-Deklaration habe ich noch nie gemacht. Und das Problem mit dem Einbinden der Headerdatei der View besteht immer. Lege bitte einfach mal ein neues Projekt mit dem MFC-Assistenten an. Und wähle bei Schritt 6 die Basisklasse CFormView.
Und nun versuche irgendwie in die Klasse CMainframe den Befehl

C++:
#include "MyView.h"

unterzubringen ohne oben genannte Fehlermeldungen zu bekommen.
Es wäre super, wenn du es für mich lösen könntest. Denn ich schaffe es nicht, wäre aber sehr an der Lösung interessiert.

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
12.05.2003, 16:49 Uhr
~l3st4rd
Gast


hi,

wenn du sie in der MainFrame.cpp, vor der MainFrame.h einbindest, müsste es gehen, dann brauchst du nicht mal eine forward deklaration.

daniel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: