Methode vom Parent dialog aufrufen, aber wie?
-
Nochmal: was steht nach dem cast in pMainDlg? Und gibst Du Deinem Dialog den pParent Pointer auch mit? Wenn Du das nicht tust, dann sind das nämlich Nullpointer.
siehe MSDN zu CDialog::CDialog:
CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL );
-
ich weis schon wast du genau meinst aber meine CMyTabCtrl managed die vielen dialoge und es reicht mir schon wenn ich in die klasse CMyTabCtrl zurück greifen kann.
Muss es unbedingt mein Hauptfenster sein?Mein haupt dialog
class CHauptdialogDlg:public CDialog { ... MyTabCtrl m_tbCtrl; }BOOL CHauptdialogDlg::OnInitDialog() { m_tbCtrl.InitDialogs(); m_tbCtrl.InsertItem(0,"Create"); m_tbCtrl.ActivateTabDialogs(); }void MyTabCtrl::InitDialogs() { m_Dialog[0]->Create(m_DialogID[0],this); //hier sage ich dass this mein parent ist }dh. ich kann nicht zurück greien auf die MyTabCtrl.
nach dem cast steht <MyTabCtrl*>(pParent); siehe mein 4. post in dem thema
-
Direkt nicht, aber indirekt - das Hauptfenster ist dein CHauptDialog, wenn du einen Zeiger darauf hast, kannst du natürlich auch dessen Member verwenden:
CHauptDialog* pDlg = dynamic_cast<CHauptDialog*>(AfxGetMainWnd()); MyTabCtrl& main_tab = pDlg->m_tbCtrl; main_tab.InitDialogs();(Anmerkungen: (1) Natürlich müssen die Zugriffsrecht so gesetzt sein, daß du von der aktuellen Stelle auf das Tab zugreifen darfst; (2) Wenn du dich bereits in der CHauptDialog-Klasse befindest, entfällt das Ganze - da kannst du direkt auf m_tbCtrl zugreifen)
-
Verstehe aber nun kann ich so wie du es geschrieben hast auch nicht zugreifen.
Es stürzt ab sobald ich eine methode aufrufe oder eine public variable zugreifen will.main_tab.a=4; //a ist ein int, das ganze schmiert leider ab.
woran könnte es denn überhaupt liegen dass es immer jedes mal abschmiert?
-
"Schmiert ab" ist eine sehr genaue Fehlerbeschreibung
Zeig doch mal etwas mehr zusammenhängenden Code.(und im Zweifelsfall ist es auch hilfreich, den Rückgabewert von dynamic_cast auszuwerten)
-
nunja da ist kein zusammenhängender code
Hier der genaue code:
DIALOG2::DIALOG2(CWnd* pParent /*=NULL*/) : CDialog(DIALOG2::IDD, pParent) , m_port() , m_recieveddata(_T("")) { CServerDlg* pMainDlg = dynamic_cast<CServerDlg*>(AfxGetMainWnd()); //MyTabCtrl& main_tab = pMainDlg->m_tbCtrl; //main_tab.m_nPageCount=0; //{{AFX_DATA_INIT(DIALOG
-
Das ist doch mal ein Anfang

Von wo aus wird denn dieser DIALOG2 erzeugt? Und welche der Dialog-Klassen stellt das Hauptfenster deiner Anwendung dar?
(und zur Vollständigkeit: Starte mal den Debugger und schau dir an, was für einen Wert der dynamic_cast<> liefert)
-
Hmm pMainDlg hat vorhinein den Wert 0xcccccccc und nachhinein den Wert 0x0000000
und meine attribute in pMainDlg haben ein rotes rufzeichen
(error: expression cannot be evaluated)Also stimmt was beim Casten nicht, muss ich den irgend was beim DIALOG2(CWnd* pParent) übergeben?
weil ich verwende ja nachhinein die fkt. AfxGetMainWnd() und nicht pParent!!
-
Für dynamic_cast muss RTTI eingeschaltet sein. Ist es das?
-
Akca schrieb:
Hmm pMainDlg hat vorhinein den Wert 0xcccccccc und nachhinein den Wert 0x0000000
Das sieht ganz danach aus, als ob das Haupt-Fenster nicht definiert worden ist. Was für eine Anwendung (SDI/MDI/Dialog) hast du denn angelegt? Und an welcher Stelle wird dein "Hauptdialog" angelegt?
Zur Erklärung: AfxGetMainWnd() liefert theApp.m_pMainWnd und normalerweise ist die InitInstance()-Methode der Applikation dafür verantwortlich, dort einen vernünftigen Zeiger einzutragen. Bei einer Dialog-Anwendung sieht das z.B. so aus:
BOOL CMyApp::InitInstance() { ... CMyDialog dlg; m_pMainWnd = &dlg;// <- Hauptfenster definiert int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // ZU ERLEDIGEN: Fügen Sie hier Code ein, um ein Schließen des // Dialogfelds über OK zu steuern } else if (nResponse == IDCANCEL) { // ZU ERLEDIGEN: Fügen Sie hier Code ein, um ein Schließen des // Dialogfelds über "Abbrechen" zu steuern } // Da das Dialogfeld geschlossen wurde, FALSE zurückliefern, so dass wir die // Anwendung verlassen, anstatt das Nachrichtensystem der Anwendung zu starten. return FALSE; }(abgesehen von den Klassennamen ist der Code so von meinem Klassenassistenten angelegt worden)
Aber die elegantere und flexiblere Lösung dürfte es sein, als pParent die Adresse des Hauptfensters zu übergeben und über diese auf deinen Hauptdialog zuzugreifen:
DIALOG2::DIALOG2(CWnd* pParent /*=NULL*/) : CDialog(DIALOG2::IDD, pParent) , m_port() , m_recieveddata(_T("")) { CServerDlg* pMainDlg = dynamic_cast<CServerDlg*>(pParent); MyTabCtrl& main_tab = pMainDlg->m_tbCtrl; main_tab.m_nPageCount=0; } //Aufruf per CServerDlg::irgendwas() { ... DIALOG2 dlg(this); dlg.DoModal(); ... }
-
Hallo!
Es funktioniert zwar, nehme an dass es immer funktioniert hat, aber nur wenn ich NICHT im konstruktor der Dialog klasse das aufrufe.
dh. Hab die ganze Zeile in einem Button reingeschrieben und siehe da, ich kann alle Methoden aufrufen und auf alle attribute ganz prima reinschreiben und lesen juhi ich bin so fro, echt