Dump(...)
& AssertValid(...)
Sehen wir uns zum Schluss dieser Tipps&Tricks Seiten noch die beiden,
vom Anwendungs-Assistenten immer eingefügten, Methoden Dump(...) und
AssertValid(...)
Die Methode Dump(...) kann zur Ausgabe von Daten während
der Debug-Phase eingesetzt werden. Sie wird niemals automatisch durch das vom Anwendungs-Assistenten
erstellte Programm aufgerufen. Sie müssen dies immer selbst veranlassen. Wenn Sie
die Methode Dump(...) für eine MFC-Klasse überschreiben, so sollten Sie
immer die Dump(...) Methode der Basisklasse zusätzlich aufrufen und erst
danach klasseneigene Daten ausgeben. Nachfolgend der Auszug aus der Dump(...)
Methode der Datenklassen des Beispiels zu diesem Thema das auf dem Beispiel
Serialise2 aufbaut:
#ifdef _DEBUG
void CData::Dump(CDumpContext &dc)
{
CObject::Dump(dc);
dc << "CString-Object auf " << (void*)&m_CText;
dc << " mit " << (LPCSTR)m_CText << "\n\r";
dc << "Anzahl der aktuellen Daten: " << m_nNoOfValues << "\n\r";
}
#endif // _DEBUG |
Beachten Sie, dass als Ausgabestream der als Parameter übergebene
CDumpContext verwendet wird. Die Ausgabe erfolgt über diesen Stream ins
Debug-Fenster des Visual Studios. Außerdem sollten Sie die Dump(...) Methode
immer innerhalb einer #ifdef _DEBUG....#endif Anweisung einschließen.
Im fertigen Beispiel werden die Daten des Dokuments sowie die der
Datenklasse immer im Debug-Fenster ausgegeben bevor die Daten in der Serialize(...)
Methode des Dokuments gesichert werden. Zusätzlich werden noch die Daten des Anwendungsobjektes
ebenfalls im Debuggerfenster dargestellt.
/////////////////////////////////////////////////////////////////////////////
// CSerializeDoc Diagnose
#ifdef _DEBUG
....
void CSerializeDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
m_pData->Dump(dc);
}
#endif //_DEBUG
....
void CSerializeDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// ZU ERLEDIGEN: Hier Code zum Speichern
einfügen
Dump(afxDump);
AfxGetApp()->Dump(afxDump);
ar << m_pData;
}
else
{
// ZU ERLEDIGEN: Hier Code zum Laden
einfügen
ar >> m_pData;
}
AfxGetApp()->m_pMainWnd->Serialize(ar);
} |
Die Dump(...) Methoden der MFC-Basisklassen geben einige
ihrer Eigenschaften (Daten) aus. Nachfolgend ist ein Auszug der Ausgabe der
Dump(...) Methoden dargestellt wenn Sie im Beispielprogramm die Daten abspeichern:
a CSerializeDoc at $770180
m_strTitle = xx
m_strPathName = D:\Tmp\xx
m_bModified = 0
m_pDocTemplate = $770380
a CData at $771C70
CString-Object auf $771C7C mit Dok-Daten
Anzahl der aktuellen Daten: 4
a CWinApp at $417898
m_pThreadParams = $0
m_pfnThreadProc = $0
m_bAutoDelete = 1
m_hThread = $FFFFFFFE
m_nThreadID = 4294820185
m_nDisablePumpCount = 0
m_pMainWnd = a CMainFrame at $770090
m_hWnd = 0x854 (permanent window)
caption = "xx - Serialize"
class name = "Afx:400000:b:148e:6:46a7"
rect = (L 242, T 242, R 884, B 992)
parent CWnd* = $0
style = $14CFC000
m_hAccelTable = 0x21A6
m_nWindow = 0
m_nIDHelp = 0x80
m_nIDTracking = 0xE001
m_nIDLastMessage = 0xE001
with active view: a CSerializeView at $771DB0
.... |
Kommen wir nun zur Methode AssertValid(...). AssertValid(...)
dient zur Überprüfung der in einem Objekt abgespeicherten Daten. Die vom Anwendungs-Assistenten
erstellte Methode wird durch das Rahmenprogramm sehr oft aufgerufen. Beachten Sie
dies bitte, wenn Sie dieser Methode eigene Funktionalität hinzufügen. Die AssertValid(...)
Methode sollte nur eine einfache Überprüfung des Objektes auf Gültigkeit durchführen.
Enthält ein Objekt Zeiger auf andere Objekte, so sollten zwar die Zeiger auf ihre
Gültigkeit überprüft werden, nicht aber das Objekt, auf das sie zeigen.
Das nachfolgende Listing zeigt die im Beispiel implementierte AssertValid(...)
Methode. Damit Sie sehen, wie oft diese Methode durch das Rahmenprogramm aufgerufen
wird, wird bei jedem Aufruf ein Zähler inkrementiert und dieser dann ausgegeben.
void CSerializeDoc::AssertValid()
const
{
static int nCount = 0;
CDocument::AssertValid();
nCount++;
TRACE("%d ASSERT_VALID\n",nCount);
} |
Ein Programm zu diesem Thema finden Sie unter 03EPMMFC\Dump.
Als Ausgangsbasis für diese Beispiel diente wiederum das Projekt Serialize2.
|