开发Delphi对象式数据管理功能(九)
发布时间:2006-03-15 16:18:25 来源:友佳学院(整理) 网友评论 0 条20.3.1.1写
该过程带有两个参数
这个过程的意义在于,可以在程序运行过程中产生
该过程的程序是这样的:
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
try
Stream.WriteComponentRes(Instance.ClassName, Instance);
finally
Stream.Free;
end;
end;
函数中,用
20.3.1.2
ReadComponentResFile
这个函数的意义在于,配合WriteComponentResFile
该函数的程序是这样的:
function ReadComponentResFile(const FileName: string;Instance: TComponent): FileStream对象打开由FileName指定的DFM文件,然后用
TComponent;
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead);
try
Result := Stream.ReadComponentRes(Instance);
finally
Stream.Free;
end;
end;
程序中使用
20.3.1.3
函数InternalReadComponentRes
在第一节中曾经介绍过
var Instance: TComponent): Boolean;
var
HRsrc: THandle;
begin {
HRsrc := FindResource(HInstance, PChar(ResName), RT_RCDATA);
Result := HRsrc <> 0;
if not Result then Exit;
FreeResource(HRsrc);
with TResourceStream.Create(HInstance, ResName, RT_RCDATA) do
try
Instance := ReadComponent(Instance);
finally
Free;
end;
Result := True;
end;
文件与标准文本文件
20.3.1.4 DFM
在Delphi可视化设计环境中,允许程序员在代码编辑器中以文本的方式浏览和修改
实际上,
ObjectBinaryToText过程将二进制流中存储的部件转化为基于文本的表现形式,这样就可以用文本处理函数进行处理,还可以用文本编辑器进行查找和替代操作,最后可以将文本再转化成二进制流中的部件。ObjectBinaryToText过程的主程序是这样的:procedure ObjectBinaryToText(Input, Output: TStream);…end;…end;end;…end;…end;ConvertObject
var
NestingLevel: Integer;
SaveSeparator: Char;
Reader: TReader;
Writer: TWriter;
procedure WriteIndent;
const
Blanks: array[0..1] of Char = ' ';
var
I: Integer;
begin
for I := 1 to NestingLevel do Writer.Write(Blanks, SizeOf(Blanks));
end;
procedure WriteStr(const S: string);
begin
Writer.Write(S[1], Length(S));
end;
procedure NewLine;
begin
WriteStr(#13#10);
WriteIndent;
end;
procedure ConvertHeader;
begin
procedure ConvertBinary;
begin
procedure ConvertValue;
begin
…
procedure ConvertProperty;
begin
procedure ConvertObject;
begin
begin
NestingLevel := 0;
Reader := TReader.Create(Input, 4096);
SaveSeparator := DecimalSeparator;
DecimalSeparator := '.';
try
Writer := TWriter.Create(Output, 4096);
try
Reader.ReadSignature;
ConvertObject;
finally
Writer.Free;
end;
finally
DecimalSeparator := SaveSeparator;
Reader.Free;
end;
end;
过程中调用的
procedure ConvertObject;end;NestStingLevel变量表示部件的嵌套层次。
begin
ConvertHeader;
Inc(NestingLevel);
while not Reader.EndOfList do ConvertProperty;
Reader.ReadListEnd;
while not Reader.EndOfList do ConvertObject;
Reader.ReadListEnd;
Dec(NestingLevel);
WriteIndent;
WriteStr('end'#13#10);
InheritedTestForm1: TTestForm[2]前者是ffInherited
或者:
Object TestForm1: TTestForm
ConvertProperty过程用于转化属性。procedure ConvertProperty;WriteIndent语句写入属性名前的空格,
begin
WriteIndent;
WriteStr(Reader.ReadStr);
WriteStr(' = ');
ConvertValue;
WriteStr(#13#10);
end;
var
SaveSeparator: Char;
Parser: TParser;
Writer: TWriter;
Parser := TParser.Create(Input);
SaveSeparator := DecimalSeparator;
DecimalSeparator := '.';
try
Writer := TWriter.Create(Output, 4096);
try
Writer.WriteSignature;
ConvertObject;
finally
Writer.Free;
end;
finally
DecimalSeparator := SaveSeparator;
Parser.Free;
在程序流程和结构上与
procedure ConvertObject;DFM文件与
var
InheritedObject: Boolean;
begin
InheritedObject := False;
if Parser.TokenSymbolIs('INHERITED') then
InheritedObject := True
else
Parser.CheckTokenSymbol('OBJECT');
Parser.NextToken;
ConvertHeader(InheritedObject);
while not Parser.TokenSymbolIs('END') and
not Parser.TokenSymbolIs('OBJECT') and
not Parser.TokenSymbolIs('INHERITED') do ConvertProperty;
Writer.WriteListEnd;
while not Parser.TokenSymbolIs('END') do ConvertObject;
Writer.WriteListEnd;
Parser.NextToken;
end;
begin
Input.ReadResHeader;
ObjectBinaryToText(Input, Output);
end;
ObjectTextToResource
var
Len: Byte;
Tmp: Longint;
MemoryStream: TMemoryStream;
MemorySize: Longint;
Header: array[0..79] of Char;
begin
MemoryStream := TMemoryStream.Create;
try
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;
end;
- 推荐阅讯
- Oracle数据库中分区表的操作方法
- 在Delphi中应用AOP实现日志功能
- 没落的奇迹 谁会买下Delphi?
- 软件的架构与设计模式之层次原则
- Oracle数据库集中复制方法浅议
- Ajax在.NET中与Server控件的交互
- ADO数据访问模型初学者入门
- 系统构架设计应考虑的因素
- 软件的架构与模式之经典架构模式简介
- VS.NET2005 Beta2初体验之感受2005
- 阅读排行
- 1.全面剖析Delphi 2006新增特性
- 2.用Delphi开发视频聊天软件
- 3.用Win32 API枚举应用程序窗口和进程
- 4.软件的架构与设计模式之什么是架构
- 5.软件的架构与设计模式之模式的种类
- 6.Delphi中为TreeView添加单选和复选框
- 7.用Delphi实现24位真彩色图标
- 8.VS.NET2005 Beta2初体验之感受2005
- 9.程序界面设计模式慨述
- 10.没落的奇迹 谁会买下Delphi?
- 专题教程
- Windows Server-Windows Server文档-Windows Server新闻-Windows Ser PostgreSQL-PostgreSQL文档-PostgreSQL新闻-PostgreSQL专家
- WebLogic-WebLogic文档-WebLogic新闻-WebLogic专家 FreeBSD-FreeBSD文档-FreeBSD新闻-FreeBSD专家
- Linux-内核 GUI KDE Gnome DNS FTP 安全 安装-Linux专区 Windows-AD IIS ServerCore 虚拟化 安全 HPC-Windows专区
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
