mit ButtonClick Funktion eines anderen Dialogs ausführen
-
hi,
hier mal kurz der aufbau meiner anwendung:
MainFrm(MDI) - CSplitterWnd -|- CView(links) - CTabCtrl(links) -|- CDialog(A) | | | |- CDialog(B) | |- CView(rechts) - CTabCtrl(rechts) -|- CDialog(1) | |- CDialog(2) | |- CDialog(3)ich möchte nun durch clicken des Buttons "IDC_CmdTEST" (c_cmdTest) im Dialog "IDD_DIALOG3" (CDialog3)
CDialog3::OnCmdTest() { }die Funktion "TestFunc" im IDD_DIALOGA ( public: TestFunc(); )
CDialogA::TestFunc() { }ausführen.
mein versuch:
datei: "Dialog3.cpp"... #include "DialogA.h" ... ... CDialog3::OnCmdTest(); { CDialogA::TestFunc(); } ...==> bringt mir Fehler...
--> Wie muss der Code aussehen, dass es funktioniert?
Was mache ich da falsch?vielen dank.
thinux
-
Du brauchst auch noch das Objekt vom Typ "CDialogA", das hinter deinem Dialogfenster steckt. Und das solltest du bekommen, indem du dich vom Mainframe aus durch die Fenster-Hierarchie durchhangelst (oder indem du in der OnInit eine Liste aller Unterdialoge zusammenstellst, die du an zentraler Stelle lagerst):
CDialog3::OnCmdTest(); { CDialogA* dlgA = /*hol dir das Dialog-Objekt*/ dlgA->TestFunc(); }
-
Und wenn du keine Variablen aus CDialogA in der TestFunc brauchst, bzw. alle Werte direkt der Funktion übermittelst, dann kannst du TestFunc in der .h als static erklären. Dann kannst du auch die Funktion per CDialogA::TestFunc(); aufrufen. Aber wenn die Funktion so allgemein ist, fragt man sich, was sie in CDialogA zu suchen hat, dann wäre es sinnvoll die Funktion in eine Klasse weiter vorne zu integrieren.
Aber ansonsten das von CStoll verwenden. Ich denke sowieso, dass du eher dies gebrauchen wirst. Wollte nur noch ergänzen.
Grüssli
-
ok. vielen dank euch beiden
werds mal versuchen...
-
...noch n paar fragen dazu:
wie muss dieses durchhangeln syntaxmäßig aussehen? und muss ich in diesem fall alle diese header includen?
mit
oder indem du in der OnInit eine Liste aller Unterdialoge zusammenstellst, die du an zentraler Stelle lagerst
meinst du im OnCreate im MainFrame, oder?? OnInit in dem Dialog von dem der Funktionsaufruf ausgeht??
-
thinux schrieb:
meinst du im OnCreate im MainFrame, oder?? OnInit in dem Dialog von dem der Funktionsaufruf ausgeht??
Das ist ans sich egal. Wenn Du z.B. dazu übergehst in deinen CWinApp Objekt entsprechende Zeiger auf Deine View einzubauene, die dann bei erzeugen gefüllt werden hättest Du immer Zugriff. Oder bau Dir ein Singleton, dass nur die Fenster verwaltet...
In OnCreate würde ich es nur machen, wenn die Klasse nur einmal als Dialog/View verwendet wird. Eine Wiederverwendbarkeit ist dann sofort ausgeschlossen, denn eine neue Instanz würde den selben globalen Zeiger überschreiben.
Ich würde es eher in CMainFRame beim Erzeugen in den entsprechenden Variablen ablegen.
-
ok, gut.
aber ich bekomms einfach nicht hin...
kann mir jemand vielleicht ein code-beispiel geben?(oder indem du in der OnInit eine Liste aller Unterdialoge zusammenstellst, die du an zentraler Stelle lagerst)
Ich würde es eher in CMainFRame beim Erzeugen in den entsprechenden Variablen ablegen.
-
ihr wisst doch wie's geht??
kann mir denn niemand konkret sagen wie ich das umsetzten muss?
gebt mir doch bitte etwas beispiel-codemfg thinux
-
thinux schrieb:
ihr wisst doch wie's geht??
kann mir denn niemand konkret sagen wie ich das umsetzten muss?
gebt mir doch bitte etwas beispiel-codeDas ist doch albern. Ich habe es doch geschrieben. Wieviel tausend Zeilen muss man denn liefern?

Nocheinmal: Deklariere z.B. eine Member-Variable in Deinem CWinApp. Dieses Objekt kannst Du Dir immer besorgen oder es ist sowieso global definiert. Wenn das Mainframe den View anlegt speicherst Du den Zeiger dort... Da Dein Layout ja statisch ist dürftest Du damit kein Problem haben.
-
also so sieht mein Pointer in Dialog3.cpp aus
CDialogA* pDialogA = ( CDialogA* ) GetDlgItem( IDD_DIALOGA );und so will ich dann die funktion in DialogA von Dialog3 aus
pDialogA->TestFunc();(ich habe das der einfachheit halber mal mit nur 2 dialogen auf einem TabCtrl ohne splitter gemacht)
und die dialoge sind so erzeugt:
dlg = new CDialogA; ASSERT(dlg); m_DlgArray.Add(dlg); VERIFY(dlg->Create(IDD_DIALOGA, m_TabCtrl));falls das eine rolle spielt???
der fehler:
"Nicht abgefangene Ausnahme in DP1.exe (MFC42D.DLL): 0xC0000005: Access Violation."Da Dein Layout ja statisch ist dürftest Du damit kein Problem haben.
meinst du damit, dass die function "static" ist? dem ist nicht so...

-
thinux schrieb:
CDialogA* pDialogA = ( CDialogA* ) GetDlgItem( IDD_DIALOGA );und so will ich dann die funktion in DialogA von Dialog3 aus
pDialogA->TestFunc();Das dürfte daran scheitern, daß Dialog A kein Element von Dialog B ist (sondern ein anderes Element des übergeordneten TabControl)
(ich habe das der einfachheit halber mal mit nur 2 dialogen auf einem TabCtrl ohne splitter gemacht)
und die dialoge sind so erzeugt:
dlg = new CDialogA; ASSERT(dlg); m_DlgArray.Add(dlg); VERIFY(dlg->Create(IDD_DIALOGA, m_TabCtrl));falls das eine rolle spielt???
Da hast du doch den Pointer auf deinen Dialog gespeichert, also mußt du ihn nur noch bei Bedarf aus m_DlgArray auslesen.
Da Dein Layout ja statisch ist dürftest Du damit kein Problem haben.
meinst du damit, dass die function "static" ist? dem ist nicht so...
Nein, damit meinte er, daß sich der Aufbau deiner Fensterstruktur nicht ändert.
-
aha ok.
ich denk jetzt hab ichs.
vielen dank euch allen.ps. ein stichwort, dass hie noch nicht erwähnt wurde ist "extern".
(also zb. "extern CWndApp theApp;" um dann über theApp->... auf den zugriff zu bekommen)CDialog3 *dlg; dlg = (CDialog3 *) theApp.m_pMainWnd; dlg->TestFunc();es macht keinen unterschied "wo" der Dialog in der Fensterstrucktur steht.