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.



Copyright © 2004

Senden Sie Emails mit Fragen oder Kommentaren zu dieser Website an: mailto:info@cpp-tutor.de
 Wolfgang Schröder, Lerchenweg 23, D-72805 Lichtenstein. Tel: +49 7129 6470