// colledoc.cpp : implementation of the CCollectDoc class // // This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #include "stdafx.h" #include "collect.h" #include "colledoc.h" #include "resource.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMyStruct void CMyStruct::FormatMyStruct(CString& str) { str.Format(_T("{%i, %.4f, %s}"), m_int, m_float, (LPCTSTR)m_str); } #if _MSC_VER > 1020 template <> void AFXAPI SerializeElements(CArchive& ar, CMyStruct** ppElements, int nCount) #else void SerializeElements(CArchive& ar, CMyStruct** ppElements, int nCount) #endif { // Since SerializeElements is always called by the framework with nCount=1 // for a CMap<>, it is a good idea to implement SerializeElement to handle // nCount>1, in case you decide to reuse it for a CArray<> with the same // element type. if (ar.IsStoring()) { for (int i = 0; i < nCount; i++) { CMyStruct* pMyStruct = *(ppElements + i); WORD w = (WORD)pMyStruct->m_int; ar << w; ar << pMyStruct->m_float; ar << pMyStruct->m_str; nCount--; } } else { for (int i = 0; i < nCount; i++) { CMyStruct* pMyStruct = new CMyStruct; *(ppElements + i) = pMyStruct; WORD w; ar >> w; pMyStruct->m_int = w; ar >> pMyStruct->m_float; ar >> pMyStruct->m_str; } } } ///////////////////////////////////////////////////////////////////////////// // CMyObject IMPLEMENT_SERIAL(CMyObject, CObject, 0) CMyObject::CMyObject() { } CMyObject::~CMyObject() { } void CMyObject::FormatMyObject(CString& str) { str.Format(_T("{%i, %.4f, %s}"), m_int, m_float, (LPCTSTR)m_str); } void CMyObject::Serialize(CArchive& ar) { WORD w; if (ar.IsStoring()) { w = (WORD)m_int; ar << w; ar << m_float; ar << m_str; } else { ar >> w; m_int = w; ar >> m_float; ar >> m_str; } } ///////////////////////////////////////////////////////////////////////////// // CCollectDoc IMPLEMENT_DYNCREATE(CCollectDoc, CDocument) BEGIN_MESSAGE_MAP(CCollectDoc, CDocument) //{{AFX_MSG_MAP(CCollectDoc) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCollectDoc construction/destruction CCollectDoc::CCollectDoc() { } CCollectDoc::~CCollectDoc() { } BOOL CCollectDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; CString strFirst; strFirst.LoadString(IDS_INITIAL_STRING); m_stringList.AddTail(strFirst); CMyStruct* pMyStruct = new CMyStruct(); pMyStruct->m_int = 1234; pMyStruct->m_float = 12.34f; pMyStruct->m_str.LoadString(IDS_INITIAL_STRING); m_mystructList.AddTail(pMyStruct); m_intList.AddTail(100); m_dwArray.Add(100000); CMyObject* pMyObject = new CMyObject(); pMyObject->m_int = 5678; pMyObject->m_float = 56.78f; pMyObject->m_str.LoadString(IDS_INITIAL_STRING); m_myobArray.Add(pMyObject); CPoint pt(10,10); m_ptArray.Add(pt); CString strKey, strValue; strKey.LoadString(IDS_INITIAL_KEY); strValue.LoadString(IDS_INITIAL_VALUE); m_mapStringToString[strKey] = strValue; CMyObject* pMyObject2 = new CMyObject(); pMyObject2->m_int = 1357; pMyObject2->m_float = 13.57f; pMyObject2->m_str.LoadString(IDS_INITIAL_STRING); m_mapStringToMyObject[strKey] = pMyObject2; CMyStruct* pMyStruct2 = new CMyStruct(); pMyStruct2->m_int = 2468; pMyStruct2->m_float = 24.68f; pMyStruct2->m_str.LoadString(IDS_INITIAL_STRING); m_mapDWordToMyStruct[100] = pMyStruct2; return TRUE; } void CCollectDoc::DeleteContents() { m_stringList.RemoveAll(); POSITION pos = m_mystructList.GetHeadPosition(); while (pos != NULL) { delete m_mystructList.GetNext(pos); } m_mystructList.RemoveAll(); m_intList.RemoveAll(); m_dwArray.RemoveAll(); for (int n = 0; n < m_myobArray.GetSize(); n++) { delete m_myobArray[n]; } m_myobArray.RemoveAll(); m_mapStringToString.RemoveAll(); m_ptArray.RemoveAll(); pos = m_mapStringToMyObject.GetStartPosition(); while (pos != NULL) { CString str; CMyObject* pMyObject; m_mapStringToMyObject.GetNextAssoc(pos, str, pMyObject); delete pMyObject; } m_mapStringToMyObject.RemoveAll(); pos = m_mapDWordToMyStruct.GetStartPosition(); while (pos != NULL) { DWORD dwKey; CMyStruct* pMyStruct; m_mapDWordToMyStruct.GetNextAssoc(pos, dwKey, pMyStruct); delete pMyStruct; } m_mapDWordToMyStruct.RemoveAll(); } ///////////////////////////////////////////////////////////////////////////// // CCollectDoc serialization void CCollectDoc::Serialize(CArchive& ar) { POSITION pos; WORD nCount; WORD w; m_stringList.Serialize(ar); if (ar.IsStoring()) { nCount = (WORD)m_mystructList.GetCount(); ar << nCount; pos = m_mystructList.GetHeadPosition(); while (pos != NULL) { CMyStruct* pMyStruct = m_mystructList.GetNext(pos); w = (WORD)pMyStruct->m_int; ar << w; ar << pMyStruct->m_float; ar << pMyStruct->m_str; nCount--; } ASSERT(nCount == 0); } else { ar >> nCount; while (nCount-- > 0) { CMyStruct* pMyStruct = new CMyStruct; ar >> w; pMyStruct->m_int = w; ar >> pMyStruct->m_float; ar >> pMyStruct->m_str; m_mystructList.AddTail(pMyStruct); } } m_intList.Serialize(ar); m_dwArray.Serialize(ar); m_myobArray.Serialize(ar); m_ptArray.Serialize(ar); m_mapStringToString.Serialize(ar); m_mapStringToMyObject.Serialize(ar); m_mapDWordToMyStruct.Serialize(ar); } ///////////////////////////////////////////////////////////////////////////// // CCollectDoc diagnostics #ifdef _DEBUG void CCollectDoc::AssertValid() const { CDocument::AssertValid(); } void CCollectDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CCollectDoc commands