《Mastering Delphi 6》學習筆記之十 (轉)
中的Serialiation
熟悉MFC的人對Serialize這個虛擬大概不會陌生。在MFC中,如果要用Serialization機制讀取和儲存資料,大概是這樣::namespace prefix = o ns = "urn:schemas--com::office" />
void CMyDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << myString;
ar << myInt;
}
else
{
ar >> myString;
ar >> myInt;
}
}
Pascal中有沒有類似的機制呢?接觸到TReader和TWriter這兩個類之後,我知道我找到答案了。
不需多講理論,來看一個實際的例子。在Form上面放三個Edit和兩個Button,另外再加一個OpenDialog和SaveDialog。程式碼如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Serialize(SaveDialog1.FileName,True);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Serialize(OpenDialog1.FileName,False);
end;
procedure TForm1.Serialize(const FileName:string; bSave: Boolean);
var
Reader : TReader;
Writer : TWriter;
Stream : TFileStream;
begin
if bSave then begin
Stream := TFileStream.Create(FileName,fmOpenWrite or fmCreate);
Writer := TWriter.Create(Stream,4096);
Writer.WriteString(Edit1.Text);
Writer.WriteInteger(StrToInt(Edit2.Text));
Writer.WriteFloat(StrToFloat(Edit3.Text));
Writer.Free;
Stream.Free;
end
else begin
Stream := TFileStream.Create(FileName,fmOpenRead);
Reader := TReader.Create(Stream,4096);
Edit1.Text := Reader.ReadString;
Edit2.Text := IntToStr(Reader.ReadInteger);
Edit3.Text := FloatToStr(Reader.ReadFloat);
Reader.Free;
Stream.Free;
end;
end;
如果願意的話,完全可以將Serialize包裝成一個virtual method,從而讓派生類中的實現更加簡潔。
TReader和TWriter不僅能夠讀取和寫入Object Pascal中絕大部分標準資料型別,而且能夠讀寫Collection/List/Variant這些高階型別,甚至能夠讀寫Perperties和Component。不過,TReader/TWriter自身實際上提供的功能很有限,大部分實際的工作是由TStream這個非常強大的類來完成的。從TReader和TWriter的宣告中可以看到一些特別為Component而設計的方法,不難猜想,Delphi開發環境本身很可能就是利用TReader/TWriter,將構件的屬性寫入.DFM以及從.DFM檔案中讀取屬性值的。
下面的例子很有用也非常有趣,它的效果完全相當於FoDesigner中的View As Text命令:
var
DFMBuf, TextBuf : TStream;
begin
DFMBuf := TMemoryStream.Create;
DFMBuf.WriteComponent(Self);
TextBuf := TMemoryStream.Create;
DFMBuf.Seek(0,soFromBeginning);
ObjectBinaryToText(DFMBuf,TextBuf);
TextBuf.Seek(0,soFromBeginning);
Memo1.Lines.LoadFromStream(TextBuf);
TextBuf.Free;
DFMBuf.Free;
甚至可以從可檔案中讀取Form的資訊:
var
DFMBuf, TextBuf : TStream;
buf : pointer;
begin
DFMBuf := TReStream.Create(HInstance,'TForm1',RT_RCDATA);
DFMBuf.Position := 0;
TextBuf := TMemoryStream.Create;
DFMBuf.Seek(0,soFromBeginning);
ObjectBinaryToText(DFMBuf,TextBuf);
TextBuf.Seek(0,soFromBeginning);
Memo1.Lines.LoadFromStream(TextBuf);
TextBuf.Free;
DFMBuf.Free;
end;
(說明:如果窗體不是TForm1,那麼請將TResourceStream.Create一句中的第二個引數改為相應的窗體類名。)
好好讀懂這些程式碼,相信自己做一個DFM Viewer也不是遙不可及的事情了吧!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990624/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 《Mastering Delphi 6》學習筆記之九 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之八 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之五 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之六 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之七 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之四 (轉)AST筆記
- 《Mastering Delphi 6學習筆記》之二 (轉)AST筆記
- 《Mastering Delphi6》學習筆記之三 (轉)AST筆記
- Delphi5學習筆記之五筆記
- Delphi5學習筆記之四筆記
- ES6學習筆記之Function筆記Function
- 前端學習筆記之ES6~~~前端筆記
- Delphi5學習筆記之三筆記
- 學習筆記|AS入門(十) 元件篇之Service筆記元件
- java學習筆記6Java筆記
- git學習筆記6Git筆記
- CCNA學習筆記6筆記
- vue學習筆記6Vue筆記
- 一個C++程式設計師的Delphi學習筆記 (轉)C++程式設計師筆記
- ES6語法學習筆記之promise筆記Promise
- ES6學習筆記之Set和Map筆記
- Delphi 中的字串——《Delphi6 開發人員指南》讀書筆記 (轉)字串筆記
- ES6 學習筆記筆記
- ES6 學習筆記筆記
- Android學習筆記(6)Android筆記
- PL/SQL學習筆記-6SQL筆記
- es6學習筆記筆記
- 彙編學習筆記之轉移指令筆記
- CUDA 學習筆記之型別轉換筆記型別
- Redis學習筆記(十) 客戶端Redis筆記客戶端
- sed學習筆記(轉)筆記
- gurb學習筆記(轉)筆記
- ANT學習筆記 (轉)筆記
- GRUB學習筆記(轉)筆記
- TreeView學習筆記 (轉)View筆記
- ES6 學習筆記四筆記
- ES6 學習筆記一筆記
- ES6 學習筆記二筆記