Funktion aus externer Klasse in CDialog aufrufen



  • Tach zusammen..

    Ich hab eine Dialogklasse die bestimmte Filme abspielen soll. Welche Filme der Dialog abspielen soll, wird ihm über TCP/IP mitgeteilt.
    Dazu wird ein Protokoll ausgewertet, die Kommandos extrahiert und an eine Klasse "CActionControl" geschickt die dann die Kommandos auswertet und an den Dialog "CVisualDlg" weiterleitet.
    Wenn ich jetzt versuche in der Klasse CActionControl ein Object von CVisualDlg anzulegen, springt er sofort in den Konstruktor von CVisualDlg
    Objekt bilden in CActionControl:

    Konstruktor CVisualDlg:
    [code]
    #include "VisualDlg.h"
    
    void CActionControl::givingCommand(int c_id,int LF,int OL,char VF[128])
    {
    
     	CVisualDlg m_visual;
    
    	m_visual.DoCommand(c_id);
    }
    

    In DoCommand werden diverse Timer aufgerufen die verschiedene Videos starten.
    Konstruktor der Klasse CVisualDlg:

    CVisualDlg::CVisualDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CVisualDlg::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CVisualDlg)
    	// HINWEIS: Der Klassenassistent fügt hier Member-Initialisierung ein
    	//}}AFX_DATA_INIT
    	// Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt
    
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    
    }
    

    Dort wird irgendwie ein neuer Wert(0x00000000) für CWnd gebildet {CVisualDlg hWnd = ???}. Das Problem ist jetzt das der Eventloop für meinen Timer nicht mehr funktioniert. Jedes mal wenn ein Timer gestartet oder zerstört wird kommt eine Fehlermeldung: Debug Assertion Failed
    File:afxwin2.inl Line:171
    Ich glaube mal das er die Timer events nicht mehr an das richtige Window schickt oder nicht mehr auf die Klasse CVisualDlg zugreifen kann.
    Kann mir jemand sagen woran das liegt oder gibt es noch eine andere Möglichkeit
    im Dialog Funktionen aufzurufen.
    Danke schon mal im voraus!

    Beste Grüsse

    gyros



  • Warum packst Du die Initialisierungen, die in DoCommand() stattfinden nicht in CVisualDlg::OnInitDialog()? Wenn Du DoCommand() vor DoModal() oder Create() aufrufst, ist doch noch gar kein Dialogfenster erzeugt worden (deswegen der Nullpointer!)



  • Moin jencas

    Der Dialog wurde schon erzeugt. Ich möchte jetzt über die Funktion DoCommand einen neuen Film starten. Diese Filme werden über ein ActiveX-Steuerelement gestartet.
    Also ich möchte den Dialog nicht noch einmal starten.
    Die Funktionialität ist die gleiche, als wenn ich ein Label über eine Externe Klasse mit Text füllen möchte. Der Dialog existiert schon ich möchte nur auf das Steuerelement zugreifen uf denen meine Filme gestartet werden sollen. Und diese Filme werden über einen Timer gestartet.

    Beste Grüsse

    gyros


  • Mod

    Du hast aber DoModal nicht aufgerufen! Also gibt es keine Instanz des Dialoges.

    Der Einwurf von Jencas stmmt voll und ganz.

    Zudem ist es sehr irritierend einen Dialog mit einem m_ Namen auf dem Stack anzulegen. Normalerweise wird m_ nur für Member Variablen verwendet.



  • Erstmal Danke für die Hilfe.
    Sorry.. Ich weiss nicht ob ich euch richtig verstehe. Aber wenn ich DoModal vom Objekt _visual aufrufe, dann wird er doch nochmal angezeigt(Oder?,berichtigt mich wenn ich falsch liege) was ich aber nicht möchte. Der Dialog wurde schon erzeugt und angezeigt. Ich möchte einfach nur auf ein Steuerelement zugreifen.

    Beste Grüsse

    gyros



  • Würde Dir

    CActionControl* CVisualDlg::GetActionControl()
    

    weiterhelfen?



  • Moin jencas

    Habs inzwischen gelöst. Ich hab einfach bei jeder Initialisierung der Sockets den Pointer auf mein Dialog mitgegeben.

    DialogKlasse:
    m_comSocket = new CCommandSocket(this);
    
    ListenSocket:
    CCommandSocket::CCommandSocket(CVisualDlg *pdlg)
    {
    	_pdlg = pdlg;
    }
    
    pRequest = new CRequestSocket(_pdlg);
    
    RequestSocket:
    CRequestSocket::CRequestSocket(CVisualDlg *pdlg)
    {
    
    	_pdlg = pdlg;
    }
    CActionControl action(_pdlg);
    
    ActionControl:
    CActionControl::CActionControl(CVisualDlg *pdlg)
    {
    	_pdlg = pdlg;
    }
    

    und dann

    _pdlg->DoCommand();
    

    aufgerufen.
    Und bumms es funktioniert. Jetzt hab ich aber noch ein anderes Probelem. Dazu hab ich aber einen neuen Thread eröffnet.
    Danke für die Hilfe...

    Beste Grüsse

    gyros


Anmelden zum Antworten