SDI und Dialog
-
Hallo
Hab eine SDI Anwendung (Basisklasse CFormView)erstellt und über Menue
rufe ich ein Dialog auf.
Die dazu gehörige Funktion lautetvoid 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
-
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:126For information on how your program can cause an assertio failure, see the Visual c++ documentation on assert.
"Danke Califax

-
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_DATAHab 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 FunktionBOOL 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
-
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
-
