Von TabControl Funktion in Hauptdialogklasse ausführen



  • Hi
    Hab mir nen schönes Tab Control gemacht, das funktioniert auch suppa, das problem ist, wenn zb ein Button im ersten Tab Feld (CMyTab1) eine funktion im Hauptdialog (CMyProjektDlg) ausführen soll.

    Hab schon mit

    ((CMyProjektDlg*)hWndDesDialogfeldes) -> Funktion();
    

    probiert, aber das will irgendwie net hinhauen.

    Der compiler akzeptiert das zwar, aber das programm bekommt nen error wenn ich den Button zum aufrufen der funktion starte.

    Der Debugger bleibt dann in einer Zeile stehn wo die erste Variable in der funktion gesetzt wird. Irgendwie hab ich das gefühl, dass der nich in der Dialogklasse nach dieser variable sucht, sondern in meiner Tab classe.

    Gibt es noch eine besser möglichkeit eine funktion aus einer anderen klasse auszuführen?

    mfg 5kYw4lKeR

    [ Dieser Beitrag wurde am 26.03.2003 um 22:19 Uhr von 5kYw4lKeR editiert. ]



  • Wenn es sich um eine Hintergrundfunktion handelt, kannst du dies aus deinem HauptDialog in ein Seperate Klasse packen und dies dann vom Hauptdialog und von der TabControl aufrufen.



  • Hmm weiss net was du mit hintergrundfunktion meinst, die funktion die ich ausführen will schreibt etwas in ein logfenster, was sich im hauptdialogfeld befindet.

    Hab mir die compilermessage ma genauer angeschaut und es sieht so aus als wenn hWnd nich gesetzt wäre, daher auch die fehler bei der ersten Variable, da der die nich findet weil keine hWnd vorhanden ist.

    Hab aber ne das hWnd vom hauptdialogfeld an die Tab Klasse übergeben, indem ich ne Variable als typ CMyTab gesetzt hab und dann self von dem dialogfeld an eine funktion in meiner Tab classe übergeben habe:

    MyProjektDlg.h
    ...
    CMyTab m_cMyTab
    ...
    ___________
    MyProjektDlg.cpp
    ...
    OnInitDialog()
    m_cMyTab.SetMyhWnd(self);
    ...
    ___________
    MyTab.h
    ...
    private:
    CDialog* m_pWnd
    ...
    ___________
    MyTab.cpp
    ...
    SetMyhWnd(CDialog *pWnd)
    m_pWnd = pWnd;
    ...
    OnMyButton()
    ((CMyProjektDlg*)m_pWnd)->MyFunktion();
    ...
    

    Müsste doch normal funktioniern oder sieht hier irgendwer nen Fehler?



  • Wenn du etwas anzeigen willst ist es keine Hintergrundfunktion.
    So sollte es laufen:

    MyProjektDlg.h
    ...
    CMyTab m_cMyTab
    ...
    ___________
    MyProjektDlg.cpp
    ...
    OnInitDialog()
    m_cMyTab.m_pMyWnd = (CMyProjektDlg*)this;
    ...
    ___________
    MyTab.h
    ...
    public:
    LPVOID m_pMyWnd;
    ...
    ___________
    MyTab.cpp
    ...
    #include MyProjektDlg.h
    
    ...
    OnMyButton()
     CMyProjektDlg* pdlg;
     pdlg = (CMyProjektDlg*)m_pMyWnd;
     pdlg->MyFunktion();
    ...
    


  • Hmm, da hab ich genau das selbe Problem wie bei mir.
    Hab mir mal haltepunkte gesetzt und folgendes rausgefunden:

    Der übergibt das Wnd vom haupdialog ohne probleme der Tab klasse, steht dann auch in m_pMyWnd drin. Wenn ich aber jetzt nen Haltepunkt in die funktion von meinem Button setze, dann seh ich dort, dass m_pMyWnd leer ist, der debugger Zeigt dann nurnoch an:

    pdlg = 0xcccccccc {CMyProjektDlg hWnd=???}

    kurz nach der übergabe hat m_pMyWnd aber folgenden wert:

    m_pMyWnd = 0x0012fc28 {CMyProjektDlg hWnd=0x0012fc28}

    Also bedeutet das, dass es gelöscht wird, anders kann ich mir das nicht vorstellen, ne idee warum ?

    mfg 5kYw4lKeR



  • Ich habe die Funktion noch mal getestet, Sie läuft problemlos.
    Das pdlg = 0xcccccccc {CMyProjektDlg hWnd=???} ist leicht erklärt,
    den Haltepunkt auf die nächste Zeilen setzen (auf pdlg->MyFunktion();), denn es wird vor der Funktion angehalten und dann hat pdlg noch keine Zuweisung. Das hWnd bezieht sich auf pdlg->m_hWnd und das ist noch nicht zugewiesen.
    Der Fehler liegt w*****einlich in der Funktion die du ausführen willst.
    Teste es doch erstmal mit einer MessageBox und verschiebe diese in deiner Funktion immer weiter nach unten bis der Fehler auftritt.



  • Ich kann nich sagen woran das liegt das es bei mir nicht gefunzt hat, jedenfalls war es nicht die funktion, und auch wenn ich das programm nach benutzung der Variable angehalten hab war die Variable leer, ka warum.

    Jedenfalls hab ich ne alternative rausgefunden, weiss nur net ob das vielleicht irgendwann ma probleme machen könnte, aber bis jetzt läuft alles einwandfrei.
    An das Wnd von meinem Dialog komm ich wie folgt:
    MyWnd = (CMyProjektDlg*)GetActiveWindow();

    Dann setz ich das ganze ein:
    ((CMyProjektDlg*)MyWnd)-> Funktion();

    Das funzt 1A, weiss nur net ob das mit dem "Active" probleme macht wenn ich nachher mal mehrere Fenster hab.



  • ((CMyProjektDlg*)hWndDesDialogfeldes) -> Funktion();

    du kannst doch nicht ein HWND in eine C++ Klasse casten und dann noch eine Methode darauf aufrufen. Das kann doch nicht gehen. 😮 😮 😮



  • blub ...

    [ Dieser Beitrag wurde am 02.04.2003 um 07:40 Uhr von dEUs editiert. ]



  • Weiss auch net so recht, aber funzen tuts 😃 das ist die Hauptsache, solange das weiterhin auch so gut funzt wie jetzt, dann bin ich zufrieden



  • So, nach ewigem Suchen im Internet hab ich nun endlich einen Thread gefunden, der das gleiche Problem, das ich auch habe behandelt. Pauls Lösung geh bei mir auch nicht. Sonst weiß niemand eine Lösung?
    Danke
    Cu HUrra


Anmelden zum Antworten