不用VC中的Document能否儲存資料 (轉)
不用VC中的Document能否資料
(本文只適合初學者閱讀,如果你是高手,而且你非要看,那就當成是茶餘飯後的消遣吧.:-))
我剛開始學VC的時候一直被那讓人頭痛的Document/View結構給搞的頭暈.
真的,我還記得第一次使用輸出,ar< 也搞不明白,是個怎麼會事情.後來,我知道是CArchive過載了<>兩個運算子. 作用是吧,中的資料永久儲存到上(說句,這裡永久是相對的如果你 把磁碟格式化一樣什麼也沒了).可是這些一般都是在CDocument類的派生類中重寫 Serialize來完成的.這是很自然,因為CDocument可以理解是一個的抽象形式 而View則正是需要Document提供的資料,來完成對的顯示.可是想想.如果,我是 如果,有一天使用者都是瞎子,或者他們不想看所有的資料,那要是還是吧,那些要顯示和不要顯示 的資料都放在CDocument類中嗎?那樣結構顯然是有點亂.是的,CDocument完全是因為要 和CView進行互動才必須要用到的.那麼好吧,雖然不要使用者看見那些資料,可是又必須要 儲存的資料,我們該怎麼辦?是啊,誰都想的到,一定要用到Serialize否則什麼也無法進行 根據MSDN的說法.要擁有Serialize必須要從C類派生類才可以那樣做.還要什麼想想看 當然是一個SaveData和一個LoadData了,要知道我們只是不想讓使用者來干預,而不是不處理這些 資料,也就是說這些資料僅僅只是不和View打交道.那麼好吧,我還是來點例子,那樣會更有說服力 我先在CSerData.h class CSerData : public CObject public: virtual void Serialize(CArchive& ar); 瞧見了,我要改寫Serialize那個虛擬函式.要不怎麼能完成我們自己的事情呢?還有我新增了 兩個要儲存的資料,一個int和一個CString,你可以把它想象成,一個唯一標示的ID和一個 可以相同的名字.你甚至可以把它想象成,一份,一個凡是讓你討厭的使用者的名單列表 可你不會傻到要那些使用者看見,否則他就會去修改這些資料了.呵呵..當然這是打個比方. 下面我們來實現CPP檔案. #include "stdafx.h" IMPLEMENT_SERIAL(CInfo,CObject,1) void CInfo::Serialize(CArchive& ar) 接下來,看看我們還要做點什麼?別忘了,如果不把它們寫到檔案裡,你也別想知道 那些使用者進了黑名單.記得這檔案只有你才打的開.好吧,還記得,我在CSerData.H 中的 SaveData();和LoadData();,這兩個函式嗎?是的,它們就是來完成這一工作的 (也許把它們寫到類的外面成為一個全域性函式更為符合C++風格.可我覺得真正的OO應該寫類內) 如果你不願意那樣做,你可以寫到外面,我想只要你願意,也不發火,沒人管的著你. #define DATA_FILE _T("DataTest.dat") if (_access(DATA_FILE, 0)) if(nTemp==0) if (m_bCanSave) // The file exists with read & write permissions 上面的save操作已經結束,我想該是load的時候了 void LoadData() { if (file.Open(DATA_FILE,CFile::typeBinary | } m_nID = CSerData.m_nID; 如果你是高手,讀到這兒.就已經說明,你今天很閒,或者你是來找點茶餘飯後的消遣 那好吧,我的文章希望就能帶給你們這麼多,下次見.
{
DECLARE_SERIAL(CSerData)//千萬別忘了這個宏否則什麼也做不了(建議參考<>)
int m_nID;
CString m_strName;
Bool m_IsSave=False;
SaveData();
LoadData();
};
#include "CSerData.h"
{
if (ar.IsLoading()) // If you are loading data from the disk
{
ar >> m_strName;
ar >> m_nID;
}
else // If you are storing data to the disk
{
ar << m_strName;
ar << m_nID;
}
}
就想你常做的那樣,僅僅只是ar<
void SaveData()
// Code to serialize and save the data
{
UINT nFlags = CFile::typeBinary | CFile::modeWrite;
{
nFlags |= CFile::modeCreate;
// The file doesn't exist, so create it
m_bCanSave = TRUE;
}
else
{
int nTemp = _access(DATA_FILE, 6);
// Check Read Write Pessions
m_bCanSave = TRUE;
}
{
CFile file;
CFileException fe;
if (file.Open(DATA_FILE, nFlags, &fe))
{
CArchive ar(&file, CArchive::store);
UpdateData(TRUE);
CSerData.m_nID = m_nID;
CSerData.m_strName = m_strName;
CSerData.Serialize(ar); // Serialize the data
}
}
}
//Code to load data
if (_access(DATA_FILE, 6)==0) // If File Exists
{
CFile file;
CFileException fe;
CFile::modeRead, &fe))
{
CArchive ar(&file, CArchive::load);
Info.Serialize(ar);
}
m_strName = CSerData.m_strName;
UpdateData(FALSE);
}
終於寫完了,希望不是那麼糟糕.希望有點人氣度.我在上面說了,本文只適合初學者
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-996719/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iOS--Document路徑下儲存資料的總結iOS
- 為什麼不用資料庫儲存圖片?資料庫
- iOS中的資料儲存iOS
- Android中的資料儲存之檔案儲存Android
- Android中的資料儲存Android
- MySQL資料庫的儲存引擎(轉)MySql資料庫儲存引擎
- iOS開發資料儲存篇—iOS中的幾種資料儲存方式iOS
- 在關聯式資料庫中儲存RDF (轉)資料庫
- 記憶體中的資料儲存記憶體
- 使用資料庫儲存session的方法 (轉)資料庫Session
- 資料儲存--檔案儲存
- 資料儲存--面向列的儲存設計
- 資料儲存
- Android中的資料儲存之SharedPreferencesAndroid
- 分散式儲存中的資料分佈策略分散式
- 淺談資料庫中的儲存過程資料庫儲存過程
- Web應用中的離線資料儲存Web
- JavaScript中的資料型別-儲存差別JavaScript資料型別
- 樹型結構資料在資料庫基本表中的儲存及維護 (轉)資料庫
- VC++儲存繪製的圖形-1C++
- 聚焦資料時代新儲存需求,浪潮儲存的新儲存之道
- 資料儲存(1):從資料儲存看人類文明-資料儲存器發展歷程
- 在瀏覽器上儲存資料(轉)瀏覽器
- 使用儲存過程(PL/SQL)向資料庫中儲存BLOB物件儲存過程SQL資料庫物件
- 資料的儲存區域
- 有效儲存資料的方法
- python的資料儲存Python
- 在VC++中建立自定義資料庫類 (轉)C++資料庫
- oracle中的數值資料儲存格式分析(ZT)Oracle
- 資料儲存:CoreData
- iOS 資料儲存iOS
- IOS資料儲存iOS
- Delphi中儲存影像列表 (轉)
- 【轉載】把握資料倉儲中的"鍵"
- 關於在BSTR中儲存二進位制資料的若干問題 (轉)
- MySQL資料庫MyISAM儲存引擎轉為Innodb的方法MySql資料庫儲存引擎
- bbs的資料結構和儲存過程(二) (轉)資料結構儲存過程
- bbs的資料結構和儲存過程(一) (轉)資料結構儲存過程