Fehler bei ShowWindow im Bezug auf eine Control-Variable eines Bildes aus anderer Klasse
-
Hi Leute
Ich mlchte aus meiner Klasse CID80ESLKDlg die Variablen m_MDTred, ... (siehe Quelltext) ansprechen. Die Variablen sind public. Was ist da falsch? Ich bekomm immer einen Assertion-Fehler im Bezug auf ShowWindow.
File: winocc.cpp
Line: 330void CMacros::MDT_Status_Ausgabe (int ii)
{
CID80ESLKDlg ID80;
if (ii == 1)
{
ID80.m_MDTred.ShowWindow(TRUE);
ID80.m_MDTorange.ShowWindow(FALSE);
ID80.m_MDTgreen.ShowWindow(FALSE);
ID80.m_MDTunknown.ShowWindow(FALSE);
}
...
}
-
Du erstellst da ein neues CID80ESLKDlg-Objekt, das am Ende dieser Funktion wieder zerstört wird. Dieses Objekt repräsentiert kein Fenster.
Vermutlich gibt es irgendwo schon ein CID80ESLKDlg-Objekt. Das musst du benutzen, nicht einfach ein neues anlegen. "Was du in einen Schrank hineinlegst, kannst du nicht aus einem anderen herausholen."
-
Hast du denn schon die Create-Methode der m_MDT.. Member aufgerufen? Die assertion tritt an dieser Stelle immer auf wenn kein gültiges HWND vorhanden ist.
-
connan schrieb:
Hast du denn schon die Create-Methode der m_MDT.. Member aufgerufen? Die assertion tritt an dieser Stelle immer auf wenn kein gültiges HWND vorhanden ist.
könntest du mir das genauer erklären?
Die Klasse CID80ESLKDlg ist die Klasse der Oberfläche und einiger Funktionen. Von diesen Funktionen springe ich wie folgt in das Macro:
void CID80ESLKDlg::Funktion (void)
{CMacros macro;
...
...
if (...)
{
macro.MDT_Status_Ausgabe(1);
}
...
}
-
Stefan_Walter schrieb:
könntest du mir das genauer erklären?
Der Ansatz bringt dich nicht weiter. Du hast da ja schon ein CID80ESLKDlg-Objekt.
Verpass CMacros einen CID80ESLKDlg*-Member, und setz den vor dem Aufruf der Funktion:
void CID80ESLKDlg::Funktion (void) { CMacros macro; macro.zeigerAufDialog = this; if (...) { macro.MDT_Status_Ausgabe(1); } }In der Funktion benutzt du dann diesen Zeiger:
void CMacros::MDT_Status_Ausgabe (int ii) { if (ii == 1) { zeigerAufDialog->m_MDTred.ShowWindow(TRUE); zeigerAufDialog->m_MDTorange.ShowWindow(FALSE); zeigerAufDialog->m_MDTgreen.ShowWindow(FALSE); zeigerAufDialog->m_MDTunknown.ShowWindow(FALSE); } ... }Alternativ kannst du den Zeiger auch der Methode als Parameter hinzufügen.
-
ich hab das so übernommen, geht aber nicht, was muss ich mit dem Zeiger genau machen, der kennt den ja im Macro nicht.
-
Du spendierst einfach deiner CMakros eine Membervariable zeigerAufDialog vom Typ CID80ESLKDlg* das ist eigentlich schon alles, dann hast zugriff auf den Dialog innerhalb von CMakros.
-
Hab das jetzt gemacht und der Fehler, den ich ooben geschrieben habe ist jetzt auch weg. allerdings hab ich noch einen bei
File: wincore.cpp
Line 4184 und 4191 (die fetten)
[cpp]
BOOL CWnd::UpdateData(BOOL bSaveAndValidate)
{
ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?
CDataExchange dx(this, bSaveAndValidate);// prevent control notifications from being dispatched during UpdateData
_AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
HWND hWndOldLockout = pThreadState->m_hLockoutNotifyWindow;
ASSERT(hWndOldLockout != m_hWnd); // must not recurse pThreadState->m_hLockoutNotifyWindow = m_hWnd;BOOL bOK = FALSE; // assume failure
TRY
{
DoDataExchange(&dx);
bOK = TRUE; // it worked
}
CATCH(CUserException, e)
{
// validation failed - user already alerted, fall through
ASSERT(!bOK);
// Note: DELETE_EXCEPTION_(e) not required
}
AND_CATCH_ALL(e)
{
// validation failed due to OOM or other resource failure
e->ReportError(MB_ICONEXCLAMATION, AFX_IDP_INTERNAL_FAILURE);
ASSERT(!bOK);
DELETE_EXCEPTION(e);
}
END_CATCH_ALLpThreadState->m_hLockoutNotifyWindow = hWndOldLockout;
return bOK;
}[/cpp]
-
hab's rausgefunden. Scheinbar darf man dann das UpdateData nicht im Macro aufrufen
Danke für die Hilfe!
-
Öhmm was soll dieses rumgefrickel?!
zeigerAufDialog->m_MDTred.ShowWindow(TRUE);
... schon alleine eine Public Memebervariable...Stefan_Walter
Ist CID80ESLKDlg dein Hauptdialog?! Wenn ja... dann mach das mal anständig.
Entweder fu fügst deinen CID80ESLKDlg mal eine schöne public Memberfuncton zu, die dann einfach wie folgt aussieht:void CID80ESLKDlg::MDT_State_Output(int ii) { if (ii == 1) { m_MDTred.ShowWindow(TRUE); m_MDTorange.ShowWindow(FALSE); m_MDTgreen.ShowWindow(FALSE); m_MDTunknown.ShowWindow(FALSE); } // ... }Die rufst du diese einfach auf. Ich weiß imo garnet was du da wirklich machen willst
nen Pointer aufn MainDlg bekommst de mit AfxGetMainWnd(...)...