SDI und Dialog



  • Hallo

    Hab eine SDI Anwendung (Basisklasse CFormView)erstellt und über Menue
    rufe ich ein Dialog auf.
    Die dazu gehörige Funktion lautet

    void CSerialView::OnShowdlgAnlage()
    {
    // TODO: Code für Befehlsbehandlungsroutine hier einfügen
    CNeueAnlagen CMyDlg;
    int nReturnWert;

    // Hier wird der Dialog initialisiert

    CMyDlg.m_nSynColor= m_nSynColor;
    CMyDlg.m_ctrEdit3.SetHintergrundFarbe(RGB(239,213,213));

    // Dialog anzeigen
    nReturnWert = CMyDlg.DoModal();
    // Returncode auswerten
    if (nReturnWert == IDOK)
    {
    TRACE("Dialogdaten übernommen\n");
    m_nSynColor = CMyDlg.m_nSynColor;
    }
    else
    TRACE("Dialog abgebrochen");

    }

    Beim initialisieren des Dialoges im Debug modus erhalte ich eine Fehlermeldung, im Releas modus nicht. Da ich vermute das ich kein Handel auf "m_ctrEdit3.SetHintergrundFarbe(RGB(239,213,213))" habe.

    m_ctrEdit3 ist in der Dialogklasse so deviniert:

    "DDX_Control(pDX, IDC_EDIT3, m_ctrEdit3);"
    "CEingabefeld m_ctrEdit3;"

    Mit CEingabefeld manpuliere ich die Hintergrundfarbe vom einem Eigabefeld.
    Wie komme ich an das Handel?

    Mit freudlichem Gruß
    Califax


  • Mod

    Welche Fehlermeldung erhälst Du?
    Dir muss klar sein, dass vor Aufruf von DoModal, keines der Child Controls existiert. Sollte diese Methode also das m_hWnd des COntrols benötigen, bzw. die Existenz des Fensters voraussetzen, muss es zu einem ASSERT kommen.
    BTW: Gib uns an was für einen Fehler Du bekommst, dann ist es einfacher gezielt zu helfen.



  • Hallo Martin

    Die Fehlermeldung lautet.

    "
    Debug Assertion Failed!
    Program:C:\c++\code Beispiel\Serial_004\Debug\Serial.exe
    File:afxwin2.inl
    Line:126

    For information on how your program can cause an assertio failure, see the Visual c++ documentation on assert.
    "

    Danke Califax 😕


  • Mod

    Welche Code Zeile ist das in welcher Funktion? Du hast nichtgeschrieben welche MFC Version! Aber meine ertse Begründung scheint korrekt zu sein.



  • Du schreibst vor doModal
    // Hier wird der Dialog initialisiert
    CMyDlg.m_nSynColor= m_nSynColor;
    CMyDlg.m_ctrEdit3.SetHintergrundFarbe(RGB(239,213,213));

    kommentier mal die beiden zeilen aus.



  • Hi

    Ich benutze VC++ 6.0 SP 6
    Der Code des Dialogs

    // NeueAnlagen.cpp: Implementierungsdatei
    
    void CNeueAnlagen::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CNeueAnlagen)
    	DDX_Control(pDX, IDC_EDIT3, m_ctrEdit3);
    	DDX_Radio(pDX, IDC_RADIO1, m_nSynColor);
    	//}}AFX_DATA_MAP
    }
    
    // NeueAnlagen.h : Header-Datei
    
    // Dialogfelddaten
    	//{{AFX_DATA(CNeueAnlagen)
    	enum { IDD = IDD_DIALOG2 };
    	CEingabefeld	m_ctrEdit3;
    	CString	m_strAbteilung;
    	CString	m_strAnlage;
    	//}}AFX_DATA
    

    Hab ich das richtig verstanden?

    Mit dem Code aus der Funktion

    void CSerialView::OnShowdlgAnlage()
    CMyDlg.m_nSynColor= m_nSynColor;
    

    wird eigendlich nur ein Optionsfeld als markiert gesetzt.
    Also nicht Teil meines Problems.

    Und mit dem Code auch aus der Funktion

    void CSerialView::OnShowdlgAnlage()
    CMyDlg.m_ctrEdit3.SetHintergrundFarbe(RGB(239,213,213));
    

    will ich eigendlich aus der SDI Anwendung herraus
    ein Eingabefeld im Dialog die Hintegrundfarbe setzen.
    Wenn ich in der Dialogklasse "CNeueAnlagen" in der Funktion

    BOOL CNeueAnlagen::OnInitDialog() 
    
    m_ctrEdit4.SetHintergrundFarbe(RGB(249,255,195));
    

    so starte ist alles OK .
    Also die Funktion "BOOL CNeueAnlagen::OnInitDialog() " soll
    nicht benutzt werden.

    Gruß Califax


  • Mod

    Du musst trennen zwischen einem erzeugten Control und der Wrapper Klasse.
    Wenn Du eine Membervariable setzt, dann wird eben nur ein Wert kopiert, der hat aber noch keinen Einfluiss auf das Control selbst, dass die Daten anzeigen soll (Radio, Edit Control etc.)

    Wenn Du nun eine Membervariable benutzt, die ein Control vertritt, dann muss Dir klar sein, dass erst nach Aufruf von DoModal, das Control erzeugt wird. Frühestens kannst Du in OnInitDialog darauf zugreifen. Deshalb werden die Daten aus den Variablen in OnInitDialog auch erst an die Controls übertragen.

    BTW: Es ist verwirrend eine Variable, die einen Dialog auf dem Stack entspricht mit C beginnen zu lassen (CMyDlg)!



  • Hallo Martin

    Danke für Deine Bemühungen, wenn ich Dich richtig verstanden, hab sieht meine Lösung wie folgt aus.
    Mit der Funktion rufe ich das Dialog auf und übergebe die Farbangaben
    über die m_RGB_Edi...

    void CSerialView::OnShowdlgAnlage() 
    {
    	// TODO: Code für Befehlsbehandlungsroutine hier einfügen
        CNeueAnlagen    MyDlg;
        int         nReturnWert;
    
    	// Hier wird der Dialog initialisiert
    
    	MyDlg.m_nSynColor= m_nSynColor;
    	MyDlg.m_RGB_Edit3=RGB(255,22,219); 
    	MyDlg.m_RGB_Edit4=RGB(249,255,195); 
    	MyDlg.m_RGB_Edit5=RGB(195,255,201);
    	MyDlg.m_RGB_Edit6=RGB(255,222,219); 
    
    	// Dialog anzeigen
        nReturnWert = MyDlg.DoModal();
        // Returncode auswerten
        if (nReturnWert == IDOK)
        {
            TRACE("Dialogdaten übernommen\n");
    		m_nSynColor = MyDlg.m_nSynColor;
        }
        else
            TRACE("Dialog abgebrochen");
    
    }
    

    dann rufe ich die Funktion "OnInitDialog" des Dialogs auf
    und initialisiere die Eingabefelder mit der gewünschten Hintergrundfarbe.

    COLORREF m_RGB_Edit3;
    usw...
    
    BOOL CNeueAnlagen::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
    
    	// TODO: Zusätzliche Initialisierung hier einfügen
    
    	// Hier werden die Hintergrundfarben gesetzt
    	m_ctrEdit3.SetHintergrundFarbe(m_RGB_Edit3);
    	m_ctrEdit4.SetHintergrundFarbe(m_RGB_Edit4);
    	m_ctrEdit5.SetHintergrundFarbe(m_RGB_Edit5);
    	m_ctrEdit6.SetHintergrundFarbe(m_RGB_Edit6);
    
    	// Hier wird der Erste Radio Buttom markiert
        m_nSynColor;
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurückgeben
    }
    

    Und alles ist schön.

    Gruß Califax


  • Mod

    👍


Anmelden zum Antworten