程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> DFM文件與標准文本文件轉換

DFM文件與標准文本文件轉換

編輯:Delphi

在Delphi可視化設計環境中,允許程序員在代碼編輯器中以文本的方式浏覽和修改DFM文件內容。當用File/Open命令直接打開DFM文件或者選擇窗體設計窗口的彈出式菜單上的View as Text命令時,就會在編輯器中出現文本形式的信息。在一些資料中將這種文本形式稱之為窗體設計腳本。Delphi提供的這種腳本編輯功能是對Delphi可視化設計的一大補充。當然這個腳本編輯能力是有限制的,比方說不能在腳本任意地添加和刪除部件,因為代碼和DFM腳本是緊密相連的,任意添加和修改會導致不一致性。但在動態生成的DFM文件中,就不存在這一限制。

實際上,DFM文件內容是二進制數據,它的腳本是經過Delphi開發環境自動轉化的,而且Delphi VCL中的Classes庫單元提供了在二進制流中的文件DFM和它的腳本之相互轉化的過程。它們是ObjectBinaryToText和ObjectTextToBinary、ObjectResourceToText和ObjectTextToResource。

ObjectBinaryToText過程將二進制流中存儲的部件轉化為基於文本的表現形式,這樣就可以用文本處理函數進行處理,還可以用文本編輯器進行查找和替代操作,最後可以將文本再轉化成二進制流中的部件。

ObjectTextToBinary過程執行的功能與ObjectBinaryToText相反,將TXT文件轉換為二進制流中的部件,而且只要TXT文件內容的書寫符合DFM腳本語法,ObjectTextToBinary可將任何程序生成的TXT文件轉換為部件,這一功能也為DFM文件的動態生成和編輯奠定了基礎。

DFM文件與DFM腳本語言之間相互轉換的任務由ObjectResourceToText和ObjectTextToResource兩個過程完成。

下面以我所擁有的Delphi編程資料作詳細說明:

ObjectResourseToText過程比較簡單,如下:

procedure ObjectResourceToText(Input,Output:TStream);
begin
Input.ReadResHeader;
ObjectBinaryToText(Input,Output);
end;

ObjectTextToResource過程就比較復雜,因為DFM文件資源頭中要包含繼承標志信息,因此在調用ObjectTextToBinary後,就讀取標志信息,然後寫入資源頭。

procedure ObjectTextToResource(Input,Output:TStream);
var
Len:Byte;
Tmp:Longint;
MemoryStream:TMemoryStream;
MemorySize:Longint;
Header:array[0.79] of Char;
begin
MomoryStream:=TMemoryStream.Create;
try
ObjectTextToBinary(Input,MemoryStream);
MemorySize:=MemoryStream.Size;
FillChar(Header,SizeOF(Header),0);
MemoryStream.Position:=SizeOf(Longint);{Skip header}
MemoryStream.Read(Len,1);
if Len and $F0=$F0 then
begin
if ffChildPos in TFilerFlags(Len and $F0) then
begin
MemoryStream.Read(Len,1);
case TValueType(Len) of
vaInt8:Len:=1;
vaInt16:Len=2;
vaInt32:Len=4;
end;
MemoryStream.Read(Tmp,Len);
end;
MemoryStream.Read(Len,1);
end;
MemoryStream.Read(Header[3],Len);
StrUpper(@Header[3]);
Byte((@Header[0])^):=$FF;
Word((@Header[1])^):=10;
Word((@Header[Len+4])^):=$1030;
Longint((@Header[Len+6])^):=MemorySize;
Output.Write(Header,Len+10);
Output.Write(MemoryStream.Memory^,MemorySize);
finally
MemoryStream.Free;
end;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved