不用VC中的Document能否儲存資料 (轉)

worldblog發表於2008-01-06
不用VC中的Document能否儲存資料 (轉)[@more@]

  不用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
{
DECLARE_SERIAL(CSerData)//千萬別忘了這個宏否則什麼也做不了(建議參考<>)

public:

  virtual void Serialize(CArchive& ar);
  int m_nID;
  CString m_strName;
  Bool m_IsSave=False;
  SaveData();
  LoadData();
};

瞧見了,我要改寫Serialize那個虛擬函式.要不怎麼能完成我們自己的事情呢?還有我新增了

兩個要儲存的資料,一個int和一個CString,你可以把它想象成,一個唯一標示的ID和一個

可以相同的名字.你甚至可以把它想象成,一份,一個凡是讓你討厭的使用者的名單列表

可你不會傻到要那些使用者看見,否則他就會去修改這些資料了.呵呵..當然這是打個比方.

下面我們來實現CPP檔案.

#include "stdafx.h"
#include "CSerData.h"

IMPLEMENT_SERIAL(CInfo,CObject,1)

void CInfo::Serialize(CArchive& ar)
{
  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<

接下來,看看我們還要做點什麼?別忘了,如果不把它們寫到檔案裡,你也別想知道

那些使用者進了黑名單.記得這檔案只有你才打的開.好吧,還記得,我在CSerData.H

中的 SaveData();和LoadData();,這兩個函式嗎?是的,它們就是來完成這一工作的

(也許把它們寫到類的外面成為一個全域性函式更為符合C++風格.可我覺得真正的OO應該寫類內)

如果你不願意那樣做,你可以寫到外面,我想只要你願意,也不發火,沒人管的著你.

#define DATA_FILE _T("DataTest.dat")


void SaveData() 
//  Code to serialize and save the data
{
  UINT nFlags = CFile::typeBinary | CFile::modeWrite;

  if (_access(DATA_FILE, 0))
  {
  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

  if(nTemp==0)
  m_bCanSave = TRUE;
  }

  if (m_bCanSave)
  {
  CFile file;
  CFileException fe;

  // The file exists with read & write permissions
  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
  }
  } 
}

上面的save操作已經結束,我想該是load的時候了

void LoadData()
//Code to load data

{
  if (_access(DATA_FILE, 6)==0) // If File Exists
  {
  CFile file;
  CFileException fe;

  if (file.Open(DATA_FILE,CFile::typeBinary |
  CFile::modeRead, &fe))
  {
  CArchive ar(&file, CArchive::load);
  Info.Serialize(ar);
  }

  }

  m_nID = CSerData.m_nID;
  m_strName = CSerData.m_strName;
  UpdateData(FALSE);
}

 


終於寫完了,希望不是那麼糟糕.希望有點人氣度.我在上面說了,本文只適合初學者

如果你是高手,讀到這兒.就已經說明,你今天很閒,或者你是來找點茶餘飯後的消遣

那好吧,我的文章希望就能帶給你們這麼多,下次見.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-996719/,如需轉載,請註明出處,否則將追究法律責任。

相關文章