Im Wizard Inforamtionen speichern
-
Hallo,
ich möchte folgendes tun. Ich hab in meiner Anwendung ein Wizard aufgebaut mit mehreren Dialogen, die dann, klar, hintereinander aufgerufen werden. Jetzt überlege ich mir grade, was wäre das sinnvollste, die Informationen aus den einzelnen Dialogen zu speichern.
Ich sammle nämlich erstmal Infos aus den einzelnen Dialogen und möchte am Ende der Wizard-Abfolge (nach Drücken von Button Fertigstellen) eine Datei (hier in dem Fall XML-Datei) mit den Informationen aus dem Wizard erstellen.
Soll ich mir eine Instanz anlegen, die ich Dialog an Dialog weitergebe, oder wäre v. ein Ablegen der Infos in einer Datei sinnvoll? All diese Lösungen finde ich bis jetzt nicht so unbedingt berauschend.
Wie würdet ihr es am Besten machen, oder wie werden die Informationen normalerweise in Wizards gespeichert?
Danke auf jeden Fall vorerst.
Gruss,
chullain
-
Ich lege dazu meistens eine eigene Klasse an, die die entsprechenden Daten enthält. Deren Instanz übergebe ich als Referenz an die einzelnen Seiten.
Diese Klasse bekommt dann Load/Save Funktionen oder auch ein Do, wenn sie gleichzeitig für die Ausführung verantwortlich ist.
-
Vielen Dank erstmal für Deinen Beitrag, aber jetzt hab ein folgendes Problem:
Ich hab mir eben so eine Klasse angelegt, wo ich meine Informationen ablege, versuche diese auch als Referenz an die einzelnen Wizard-Pages zu übergeben, jedoch bricht das Programm ab, sobald ich den Wizard ausführe...
Ich versuche mal einbisschen Quellcode hier von mir aufzuzeigen:
In meiner Hauptklasse erstelle ich erstmal ein Objekt der "Kontainer"-KlasseCPEV_Container container;...dann übergebe ich den einzelnen Pages mein Container-Objekt
CPropertySheet dlgPEV(_T("Wizard"), this, 0); C1PacketChoice_PEV page1(container); C2Quelle_PEV page2(container); C3Ziel_PEV page3(container); C4Config_PEV page4(container); C5Summary_PEV page5(container);...so sieht z.B. ein Konstruktor von mir in den einzelnen Pages auf:
C1PacketChoice_PEV::C1PacketChoice_PEV(CPEV_Container& pev_Container) { //{{AFX_DATA_INIT(C1PacketChoice_PEV) m_text = _T(""); //}}AFX_DATA_INIT rPEV_Container = pev_Container; }...jedoch sobald ich das PropertySheet mit DoModal() aufrufe, kommt der Abbruch...
dlgPEV.AddPage(&page1); dlgPEV.AddPage(&page2); dlgPEV.AddPage(&page3); dlgPEV.AddPage(&page4); dlgPEV.AddPage(&page5); dlgPEV.SetWizardMode(); if (ID_WIZFINISH == dlgPEV.DoModal()) { ... }...weiss jemand Rat für mich, warum es zu diesem Abbruch kommen könnte?
Gruss,
chullain
-
ok, hat sich schon erledigt, hab leider vergessen, bei den Konstruktoren, die Base-Klasse mitzugeben, dass diese auch als CPropertyPages anerkannt werden...
Merci...
Gruss,
chullain
-
...jetzt komm ich doch etwas durcheinander mit der Referenzierung von der Klasse...
Folgenden Aufbau habe ich in meinem Programm:
In meiner Hauptklasse erstelle die Klasse, mit der ich alle Informationen aus den einzelnen Dialogen sammeln möchte...CPEV_Container container;Das Objekt übergebe ich dann an die Dialoge (CPRopertyPage) weiter, wie hier:
C1PacketChoice_PEV page1(container);Mein Konstruktor, der dieses Objekt annimmt, sieht wie folgt aus:
C1PacketChoice_PEV::C1PacketChoice_PEV(CPEV_Container& pev_Container) : CPropertyPage(C1PacketChoice_PEV::IDD) { //{{AFX_DATA_INIT(C1PacketChoice_PEV) m_text = _T(""); //}}AFX_DATA_INIT rPEV_Container = &pev_Container; }...wobei rPEV_Container im Header so definiert ist:
CPEV_Container rPEV_Container;...wenn ich jedoch beim verlassen des ersten Dialoges in der OnWizardNext()-Methode die Werte so übergebe:
rPEV_Container.m_system = m_systemname;...kann ich in dem nächten Dialog nicht drauf zugreifen
CString m_system = rPEV_Container.m_system;..da bleibt m_system leer...
was mache ich falsch?Kann mir jemand das erklären, irgwendwie hab ich das mit den Referenzen nicht ganz verstanden...
Gruss,
chullain
-
chullain schrieb:
C1PacketChoice_PEV::C1PacketChoice_PEV(CPEV_Container& pev_Container) : CPropertyPage(C1PacketChoice_PEV::IDD) { //{{AFX_DATA_INIT(C1PacketChoice_PEV) m_text = _T(""); //}}AFX_DATA_INIT }...wobei rPEV_Container im Header so definiert ist:
CPEV_Container rPEV_Container;Muss sein:
C1PacketChoice_PEV::C1PacketChoice_PEV(CPEV_Container& pev_Container) : rREV_Container(pev_COntainer), CPropertyPage(C1PacketChoice_PEV::IDD) { //{{AFX_DATA_INIT(C1PacketChoice_PEV) m_text = _T(""); //}}AFX_DATA_INIT // EDIT: DIESE ZEILE MUSS RAUS // rPEV_Container = &pev_Container; }...wobei rPEV_Container im Header so definiert ist:
CPEV_Container &rPEV_Container;
-
ok, jetzt hab ich den Standard-Konstruktor rausgeworfen und nur den erweiterten Konstruktor mit reingenommen, so wie Du ihn aufgeschrieben hast, jedoch kommt die Fehlermeldung
binary '=' : no operator defined which takes a right-hand operand of type 'class CPEV_Container *' (or there is no acceptable conversion)hier nochmal der Kosntruktor:
C1PacketChoice_PEV::C1PacketChoice_PEV(CPEV_Container& pev_Container) : rPEV_Container(pev_Container), CPropertyPage(C1PacketChoice_PEV::IDD) { //{{AFX_DATA_INIT(C1PacketChoice_PEV) m_text = _T(""); //}}AFX_DATA_INIT rPEV_Container = &pev_Container; // <-- hier ist die Fehlermeldung }Gruss,
chullain
-
Arghhh... Schmeiß die Zeile raus, das ist doch schon durch die Konstruktion erledigt...