Probleme mit CPropertyPage / Sheet



  • Hallo alle zusammen,

    ich stehe mir gerade selbst ein bisschen auf dem Schlauch, denke ich. Google hat mir leider auch nicht wirklich weitergeholfen, also belästige ich euch einfach mal.

    Ich habe einen Dialog von CPropertySheet abgeleitet. Darin mehrere von CPropertyPage abgeleitete Seiten. Die erste Seite trägt den Titel "-" und die letzte den Titel "+" (beides sind WTNAddDel-Objekte). Dazwischen befindet sich anfangs eine Registerkarte (Klasse WTNReg, ebenfalls von CPropertyPage abgeleitet). Wenn man auf die Registerkarten + bzw. - klickt, wird in deren Funktion OnSetActive das übergeordnete CPropertySheet angewiesen, neue Registerkarten in der Mitte einzufügen:

    BOOL WTNAddDel::OnSetActive()
    {
    	if (m_psp.pszTitle=="+")
    	{
    		father->AddFile();    //father zeigt auf das übergeordnete CPropertySheet
    	}
    	else if (m_psp.pszTitle=="-")
    	{
    		father->RemoveFile();
    	}
    	else
    	{
    		MessageBox("Das AddDel-Objekt hat einen ungültigen Titel", "Bla");
    	}
    	return TRUE;
    }
    
    void WTNMain::AddFile()
    {
    	AnzahlBahnen++;
    	RemovePage(AnzahlBahnen);
    	Bahnen.push_back(new WTNReg(this));
    	CString title="Bahn ";
    	CString nummer;
    	nummer.Format("%d",AnzahlBahnen);
    	title=title+nummer;
    	Bahnen[AnzahlBahnen-1]->m_psp.pszTitle=(title);
    	Bahnen[AnzahlBahnen-1]->m_psp.dwFlags |= PSP_USETITLE;
    
    	AddPage(Bahnen[AnzahlBahnen-1]);
    	AddPage(Add);
    	SetActivePage(AnzahlBahnen);
    
    void WTNMain::RemoveFile()
    {
    	RemovePage(AnzahlBahnen);
    	Bahnen.pop_back();
    	AnzahlBahnen--;
    	SetActivePage(AnzahlBahnen);
    }
    

    Das Hinzufügen der Registerkarten funktioniert auch prima. Durch SetActivePage soll jeweils eine bestimmte Registerkarte angezeigt werden. Allerdings wird diese nur oben im Tab-Reiter als aktiv gekennzeichnet. Der Dialog des entsprechenden WTNReg-Objektes wird nicht angezeigt. Wie bekomme ich die Registerkarte dazu, ihren Inhalt zu zeichnen?
    Vielen Dank schon mal für eure Hilfe.
    Gruß
    Mathieu



  • Hallo alle zusammen,
    auf das oben beschriebene Problem habe ich immer noch keine Lösung gefunden. Allerdings habe ich festgestellt, dass die dort gepostete Art, den Titel der Registerkarten zu schreiben nicht funktioniert, da die Variable gelöscht wird, die in den Titel geschriben wird. LPCSTR ist ja nur ein Pointer... Dieser Code funktioniert so jedenfalls.

    CString* title = new CString("Bahn ");
    		CString nummer;
    		nummer.Format("%d",AnzahlBahnen);
    		(*title)=(*title)+nummer;
    		Bahnen[AnzahlBahnen-1]->m_psp.pszTitle=(*title);
    

    Jetzt kommen wir aber zu meinem neuen Problem:
    In der OnOK() Methode der CPropertySheet rufe ich für jede PropertyPage die UpdateData(1) auf. Das funktioniert allerdings nur, wenn alle Registerkarten mindestens einmal aktiv gewesen sind. Ansonsten führt das zum Absturz des Programms. Wie kann ich also meine Variablen aktualisieren?

    Vielen Dank für eure Hilfsbereitschaft! (Ehrlich ernst gemeint! Schließlich haben sich weit über hundert Leute mein erstes Problem durchgelesen)

    Mathieu


Anmelden zum Antworten