Datenaustausch zwischen PropertyPage



  • Hi Leute,
    mal wieder ein Problem.
    Ich habe einen Optionendialog mit sehr vielen Einstellungen. Nun habe ich die einzelnen Einstellungen auf drei PropertyPages verteilt. Das Proplem ist jetzt, daß sich einige Einstellungen untereinander beeinflussen, diese sind aber nicht immer auf der gleichen PropertyPage zu finden. Also z.B. habe ich auf Page1 eine Einstellung die unter anderem bewirkt, daß auf Page2 ein Editfeld disabled wird. Oder auf Page3 lasse ich einen Thread laufen, der mir eine Datei erstellt, die dann auf Page2 in einem Editfeld angezeigt werden soll. Und halt ähnliches.
    Kann mir da jemand helfen? Ich habe nicht so das Richtige gefunden.

    Danke i.V.

    P.S.: Ich starte den PropertySheet als eigene abgeleitete Klasse in meinem Anwendungsdialog, also wie einen normalen Dialog. Und die PropertyPages sind dann im Konstruktor vom PropertySheet "ge-added".


  • Administrator

    Gibt verschiedene Möglichkeiten. Du kannst zum Beispiel beim erstellen deiner Dialoge jeweils einen Zeiger zu einem anderen Dialog übergeben. So kann Dialog1 auf Dialog2 zugreifen oder umgekehrt. Wie immer du es willst. Wichtige überschreibaren Funktionen werden dann OnSetActive und OnKillActive.

    Du kannst aber auch eine Datenstruktur oder eine Datenklasse erstellen. Jedem Dialog übergibst du nun einen Zeiger auf ein Objekt, dieser Struktur oder Klasse, welche du auf dem Heap angelegt hast oder in deiner CPropertySheet-Klasse?

    Die Pages schreiben dann ihre Daten bein OnKillActive in diese Struktur über den Pointer und bei OnSetActive lesen sie die benötigten Informationen wieder heraus.

    Grüssli



  • Ich habe hier ein Problem beim anlegen eines Zeigers auf die Klasse einer PropertyPage. Da kommt immer der Syntaxfehler: Es fehlt ';' vor '*'
    Ich kann mir das nicht erklären?


  • Administrator

    Dann zeig mal den Code *g*
    Sonst kann ich es mir auch nicht erklären.

    Grüssli



  • Ich glaube es liegt daran, daß ich z.B. bei Page1 einen Zeiger auf Page2 mache und bei Page2 einen Zeiger auf Page1 usw. Dann ist da noch Page3 die widerrum einen Zeiger auf Page1 und Page2 hat. Als ich nur einen Zeiger verwendet habe, hat es ja geklappt.
    Das Problem ist jetzt nur, daß ich diese Zeiger brauche. Die eine Einstellung auf Page1 beeinflußt halt eine auf Page2 und eine andere Einstellung auf Page1 wird von Page2 beeinflußt. Und das gleiche dann auch im Bezug auf Page3.
    Vielleicht muß ich das mal mit der Struktur im PropertySheet versuchen?!



  • Das mit der Struktur geht auch nicht!!
    Ich habe also eine Struktur in der PropertySheet-Klasse erstellt, die alle Daten die ich laden will aufnimmt. Diese möchte ich dann in einer der Pages anzeigen und mit OnSetActive() laden. Ja und da fängt es ja schon an. Sobald ich die Header-Datei der PropertySheet klasse incluiere und den Zeiger anlege gibt es wieder diesen Fehler (siehe oben). Jetzt habe ich den Zeiger direkt in der C-Datei der Page gesetzt und da hat die Page natürlich die daten nicht mehr, die sind dann weg.
    Was mache ich da falsch?????



  • Ich kann es ja noch mal erklären, was ich machen will.

    Also: ich hatte einen Optionendialog, der die aktuellen Optionen aus einer XML-Datei geladen hat. In dem Optionendialog konnte man nun die Einstellungen ändern und wieder in die XML-Datei speichern. Da es nun so viele Optionen sind und das Ganze unübersichtlich wurde, wollte ich das mit einem PropertySheet machen. Jetzt ist aber das Problem, daß sich einige Optionen untereinander beeinflussen, diese aber nicht immer auf der selben Seite der PropertyPages sind.

    Ich habe dann eine PropertySheet-Klasse angelegt und die entsprechenden Pages dazu. Dann das Property in meinem Dialog aufgerufen und die Pages im Konstruktor des PropertySheet geadded. Dazu natürlich die Header der Pages in den Header des PropertySheet incluiert und dort Instanzen angelegt.
    Jetzt im OnInit des PropertySheet die Daten aus der XML-Datei in eine entsprechende Struktur geladen. Und nun wollte ich halt auf die Struktur in den Pages zugreifen mit entsprechenden Zeigern auf die Struktur.
    Ja und das funktioniert halt nicht!!!!!!!

    Bitte um Hilfe!!!!



  • Was funktioniert halt nicht? Weisst Du nicht, wie Du die Pointer in die PropertyPages bekommst, oder wie oder wer oder was?



  • wenn ich den Pointer z.B. CPropertyD* test; und dazu die Header-Datei incluiere kommt der Genannte Syntaxfehler und wenn ich das ganze direkt in die C-Datei der Page setze sind die Daten nicht mehr da, sobald ich die Page anklicke.
    So und was mache ich da nun falsch??????

    Edit: und dann gleife ich im OnInit der Page darauf zu:

    test->option.strblah usw..


  • Administrator

    Hmm ich habe schon mal gesagt, dass du mal den Code zeigen solltest, aber willst ja anscheinend nicht.

    Das einzige was mir jetzt so spontan einfällt, wäre ein Include Problem. Aber kann ich mir nicht vorstellen, dass du das nicht berücksichtigt hast ^^

    Du musst natürlich in der Header wo du den Zeiger für eine Klasse definierst, deren Header inkludieren. Bzw. am besten im Header eine Vorwärtsdefinition machen und in der .cpp inkludieren.

    Grüssli



  • Jetzt versuche ich es bei euch noch mal mit Code:
    Ich sehe da einfach den Fehler nicht!!!!!!!!!!!!!!!!!!!!!!!

    Also die PropertySheet Klasse

    #pragma once
    
    #include "AppSettings.h"
    #include "afxwin.h"
    #include "afxcmn.h"
    #include "OptSprachmaterial.h"
    #include "OptTestablauf.h"
    #include "OptLogatome.h"
    
    // CPropOptionen
    
    class CPropOptionen : public CPropertySheet
    {
    	DECLARE_DYNAMIC(CPropOptionen)
    
    public:
    	CPropOptionen(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
    	CPropOptionen(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
    	virtual ~CPropOptionen();
    
    protected:
    	DECLARE_MESSAGE_MAP()
    
    public:
    	virtual BOOL OnInitDialog();
    	COptTestablauf prog;          //das sind die PropertyPages!!!
    	COptSprachmaterial sprach;
    	COptLogatome logatom;
    
    	AppSettings set;
    	CHilfsfunktionen pfadHolen;
    	CString pfad;
    
    	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    
    	struct opt
    	{
    		CString strPfad;
    		CString strNameExe;
    		CString strKommando1;
    		CString strKommando2;
    		CString strAnzahl;
    		bool bArtLogatome;
    		int iZeit;
    		CString strWavOrdner;
    		CString strMaxAnzahl;
    		CString strAnzahlWav;
    		CString strNameLogatomListe;
    		CString strPathLogatomListe;
    		bool bGleicheListe;
    		CString strAnzahlPersonen;
    		bool bVorstellungSynthese;
    		CString strUserPath;
    		bool bLernmodus;
    		bool bLernphase;
    		int iAnzahlLernphase;
    	}option;
    };
    

    Und nun eine der Pages:

    #pragma once
    
    #include "AppSettings.h"
    #include "WavListe.h"
    #include "afxwin.h"
    #include "afxcmn.h"
    
    #include "Optionen.h" //Der Header der PropertySheet
    
    // COptSprachmaterial-Dialogfeld
    
    class COptSprachmaterial : public CPropertyPage
    {
    	DECLARE_DYNAMIC(COptSprachmaterial)
    
    public:
    	COptSprachmaterial();
    	virtual ~COptSprachmaterial();
    
    // Dialogfelddaten
    	enum { IDD = IDD_SPRACHMATERIAL };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    
    	WavListe wavlist;
    	DECLARE_MESSAGE_MAP()
    
    public:
    	CPropOptionen* optionen; // der Zeiger für die Page
    
    public:
    	virtual BOOL OnInitDialog();
    	virtual BOOL OnSetActive();
    	virtual BOOL OnKillActive();
    	BOOL opt_bArtLogatome;
    	CString opt_strNameLogatomListe;
    	CString opt_strAnzahlLogatomeListe;
    	CString opt_strWavOrdner;
    	CString opt_strAnzahlWav;
    
    	CHilfsfunktionen pfadHolen;
    	CString pfad;
    	AppSettings set;
    	CString opt_strLogatomDatei;
    	afx_msg void OnBnClickedListeLaden();
    
    	afx_msg void OnBnClickedWavliste();
    	afx_msg void OnBnClickedArtlogatome();
    	afx_msg void OnBnClickedWavlogatome();
    	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    
    	afx_msg void OnBnClickedExe();
    	CString opt_strPfad;
    	CString opt_strKommando1;
    	CString opt_strKommando2;
    	CString opt_strNameExe;
    
    };
    

    Und da kommt halt dieser Syntaxfehler. Aber ich muß doch das irgendwie incluieren!!!! Und da ist wahrscheinlich der Fehler!!!
    Aber wie mache ich das den jetzt.

    BITTE BITTE HILFE!!!!!!!!!!!!!!!!!!!!!



  • Das es mit der Incluierung zu tun hat habe ich mir halt auch schon gedacht. Aber irgendwie mache ich da was falsch. Aber damit ich die Pages in die PropertySheet-Klasse bekomme, muß ich die doch da auch incluieren??! Damit ich sie dann mit AddPage(..) im Konstruktor von PropertySheet anzeigen lassen kann!!! Und da ist halt irgendwo der Wurm drin. Aber ich sehe das einfach nicht!!


  • Administrator

    Danke, jetzt ist alles klar ^^

    Du inkludierst gegenseitig.

    // A.h
    #include "B.h"
    
    // B.h
    #include "A.h"
    

    Ergibt diesen Fehler.

    Am besten machst du einen Vorwärtsdeklaration.

    In "OptSprachmaterial.h" und all den anderen Pages machst du folgendes oben unterhalb der Includes rein:

    class CPropOptionen;
    

    Mit dieser Vorwärtsdeklaration kannst du Zeiger definieren. Aber keine Methoden aufrufen oder Objekte davon erzeugen!
    In der "OptSprachmaterial.cpp" und all den anderen Pages macht du dann das

    #include "Optionen.h"
    

    In der *.cpp kannst du nun Methoden dieses Zeigers aufrufen.

    Dann sollte es funktionieren :p

    Grüssli

    PS: Der Code hat geholfen ... siehst du 😉



  • Danke erstmal für die Hilfe. werde ich gleich mal probieren!!



  • Ich kann jetzt zwar ohne Fehler den Zeiger definieren, aber beim ausführen sind die Daten nicht mehr aktuell. Da muß noch irgendetwas falsch sein! 😞


  • Administrator

    Dumme Frage, aber übergibst du dem Zeiger auch einen Wert? Bzw. halt die richtige Adresse? Man muss dem Zeiger nämlich noch sagen, wohin der zeigen soll. Ansonsten weiss ich eigentlich nicht, was du meinst, mit nicht aktuell.

    Grüssli



  • Im OnInit des PropertySheet mache z.B. folgendes

    option.strPfad = set.in_strPfad;
    

    damit wird ein String aus meiner XML Datei in die Struktur geladen.

    mein Zeiger lautet:

    CPropOptionen* sprachmaterial;
    

    und dann mache ich bei OnSetActive oder im OnInit der Page:

    opt_strPfad = sprachmaterial->option.strPfad;
    

    ja und da ist dann halt nichts mehr drin!
    Da sehe ich bestimmt irgendwas grundsetzliches nicht?!


  • Administrator

    Tjo der Zeiger braucht doch noch eine Initialisierung. Du musst dem sagen wohin er zeigt, sonst zeigt er ins Nirvana.

    int* p; // Der Zeiger weiss nicht wohin, bzw. auf welches Objekt er zeigen muss.
    int a = 5; // Ein Int-Objekt mit dem Wert 5;
    p = &a; // p zeigt nun auf das Objekt, a mit dem Wert 5
    

    Ziemlich logisch nicht?

    Daher habe ich so langsam das Gefühl, dass wir uns irgendwie nebendurch reden ^^

    Grüssli



  • Ich hoffe ich bekomme das jetzt hin. Da habe ich wohl was mit Zeigern nicht ganz verstanden.
    Danke für die Geduld von dir.

    Beste Grüße



  • Da muß ich dann doch nochmal fragen!
    Ich habe hier doch jetzt einen Zeiger auf die Klasse:

    CPropOptionen* sprachmaterial;
    

    mit was soll ich den diese nun zuweisen. Das ist doch keine Variable im Sinne von int oder CString oder so??
    Also das Beispiel von dir kann ich doch garnicht so anwenden.

    sprchmaterial ist nun ein Zeiger auf die Klasse. Nun habe ich in der Klasse eine Struktur mit Variablen. Diese Variablen werden in der SELBEN Klasse Daten zugewiesen:

    option.strPfad = "BlahBlah";
    

    Ja und jetzt will ich über den Zeiger auf die Klasse in einer ANDEREN Klasse auf diese Daten zugreifen:

    CString str = sprachmaterial->option.strPfad;
    

    Wo ist da jetzt der fehler?? Ich habe auch schon etliche Bücher durchgewälst und da kommt das so einfach nicht vor!!!

    Normalerweise mache ich das ja immer so:

    CPropOptionen sprachmaterial; //im Header der anderen Klasse definiert
    
    CString str = sprachmaterial.option.strPfad;
    

    Aber das geht hier ja nicht so.
    Hast du das Problem erkannt??


Anmelden zum Antworten