mit ButtonClick Funktion eines anderen Dialogs ausführen


  • Administrator

    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??


  • Mod

    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-code

    mfg thinux


  • Mod

    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-code

    Das 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.


Anmelden zum Antworten