mal wieder ne anfängerfrage....



  • Oder deiner statischen Funktion eine Referenz auf eine Instanz der anderen Klasse übergeben.

    MfG Spacelord



  • hab ich mir schon fast gedacht, aber irgendwie geht das bei mir nicht:

    ich habe in der dialogfeldklasse ne funktion (public), die mir daten in listctrl schreibt.

    in meiner anderen klasse erzeuge ich ein objekt der dialogfeldklasse und rufe dann die funktion auf, die mir die daten in listctrl schreibt.

    nach erfolgreichem kompilieren, gibts dann bei der ausführung nen fehler..

    hab ich da nen denkfehler???

    danke
    thx



  • Naja,
    das Objekt der Dialogklasse,für das du die Methode aufrufst,muss auch dass sein das auf dem Bildschirm zu sehen ist.Also dass das wahrscheinlich in deiner von CWinApp abgeleiteten Klasse erstellt wird.
    Zeig doch mal etwas Code.

    MfG Spacelord



  • also das ganze ist eine dialogfeld basierte mfc anwendung mit nur einem dialog:

    in meiner dialogfeld klasse ist folgende memberfunktion:

    void CWinSocketServerDlg::ProtokollSchreiben(CString Statusmeldung)
    {
    	LVITEM lvi;
    
    	lvi.mask = LVIF_TEXT;
    	Statusmeldung.Format(_T(Statusmeldung));
    	lvi.iItem = index;
    	lvi.iSubItem = 0;
    	lvi.pszText = (LPTSTR)(LPCTSTR)(Statusmeldung);
    	m_cProtokoll.InsertItem(&lvi);
    	index++;
    
    }
    

    in meiner anderen klasse mache ich dann (in einem thread):

    UINT CMyServer::CreateServerSocket(LPVOID lpParam)
    {
    	(...)
    
    	CWinSocketServerDlg p_Interface = new CWinSocketServerDlg;
    
    	p_Interface.ProtokollSchreiben("Hallo Test");
    
    	(...)
    
    }
    

    das ergibt aber bei ausführen, wie gesagt nen fehler...
    nur verstanden habe ich es noch nicht... 😕



  • Wird in deiner CWinApp Klasse auch ein Objekt der Klasse CWinSocketServerDlg erstellt und mit doModal angezeigt?
    Welche Fehlermeldung bekommst du genau?
    Der Standardkonstruktor erzeugt eigentlich nur einen Dialog der mit keiner Resource verbunden ist,dafür müsstest du Create nutzen,allerdings hast du ja(so denke ich zumindest) schon einen Dialog in CWinApp erstellt und möchtest eigentlich auf diesen zugreifen.
    Da du das Ganze allerdings aus einem Thread heraus machst kannst du nicht einfach AfxGetApp()-> m_pMainWnd nutzen. stattdessen sollte etwas in dieser Art funktionieren:

    CWinSocketServerDlg tempDlg;
    tempDlg.Attach(AfxGetApp()->m_pMainWnd->m_hWnd);
    tempDlg.ProtokollSchreiben("Hallo Test");
    tempDlg.Detach();
    

    MfG Spacelord



  • die fehlermeldung lautet:

    (..)
    Debug Assertion Failed
    File: afxcmn.inl
    (..)

    deinen vorschlag probier ich gleich mal aus...

    danke



  • mmmhh.. jetzt gibts auch wieder nen fehler. diesmal in wincore.cpp...

    kann es sein dass das an den thread liegt?? oder mache ich da grundsätzlich was total falsch??

    thx



  • Du musst mal etwas konkreter mit deinen Fehlern werden.
    Welcher Fehler wird angezeigt?
    Wahrscheinlich wieder wurde wieder eine ASSERT-Bedingung verletzt,aber welche?
    Das kannst du dir ja mit dem Debugger anzeigen lassen.
    Die gleiche Information wäre auch für den vorherigen Fehler von Interesse.

    MfG Spacelord



  • also ich habe jetzt zum test in meiner dialogfeldklasse nen objekt von typ meiner eigenen klasse erzeugt. ich rufe dann die memberfunktion meiner eigenen klasse auf, die unten stehenden code enthält.

    wenn ich das debugge meldet er an der Markierung den Fehler wie oben beschrieben.
    "Debug Assertion..."
    File: afxcmn.inl
    (..)

    CWinSocketServerDlg tempDlg; 
    tempDlg.Attach(AfxGetApp()->m_pMainWnd->m_hWnd); 
    tempDlg.ProtokollSchreiben("Hallo Test");           //  <== Markierung
    tempDlg.Detach();
    


  • Ja,aber welche Vorraussetzung wird verletzt???
    Irgendwas der Art ASSERT(m_hWnd!=NULL) oder so...

    MfG Spacelord



  • vielen dank für die antworten, aber ich beschreibe also jetzt ma von vorn die problematik:

    in meiner dialogfeldklasse:

    class CWinSocketServerDlg : public CDialog
    {	(..)
    	CMyServer m_ServerSocket;
    	ProtokollSchreiben(CString strText);
             (..)
    }
    

    dann:

    BOOL CWinSocketServerDlg::OnInitDialog()
    {
    	(..)
    	m_ServerSocket.SetParent(this);
    	(..)
    }
    

    in meiner eigenen klasse:

    class CMyTest
    {
    	void SetParent(CDialog *pWnd);
             static MeineFunktion();
    (..)
    
    	CDialog* m_pWnd;
    (..)
    }
    
    void CMyTest::SetParent(CDialog *pWnd)
    {
    
    	m_pWnd = pWnd;
    }
    

    in der dialogfeldklasse rufe ich dann MeineFunktion auf, die dann wiederum die Funktion "ProtokollSchreiben(..)" aufruft.

    ((CWinSocketServerDlg*)m_pWnd)->ProtokollSchreiben("H");
    

    das geht aber nur, wenn "MeineFunktion" nicht static ist. sonst gibts nen typecast- fehler... und genau darum gehts: wie kann ich das umgehen?? die funktion "meine Funktion" muss doch static sein, da sie eine thread funktion ist, oder??

    danke für die umstände!!



  • schreibfehler!!
    wg obigen text:

    CMyTest = CMyServer !!!

    sorry



  • schreibfehler!!
    wg obigen text:

    CMyTest = CMyServer !!!

    sorry


Anmelden zum Antworten