当前位置:中国易下载软件教材中心文章中心编程语言Delphi → Delphi的“动态窗体”技术实际应用

Delphi的“动态窗体”技术实际应用

减小字体 增大字体 作者:佚名  来源:不详  发布时间:2007-8-21 0:58:06
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
喜欢这些内容嘛,请告诉你身边的朋友,易下载中心-QQ资源-itnetcn.com一起享受这份乐趣,本站内容来源互联网
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

在Delphi可视化设计环境中,允许程序员在代码编辑器中以文本的方式浏览和修改DFM文件内容。当用File/Open命令直接打开DFM文件或者选择窗体设计窗口的弹出式菜单上的View as Text命令时,就会在编辑器中出现文本形式的信息。在一些资料中将这种文本形式称之为窗体设计脚本。Delphi提供的这种脚本编辑功能是对Delphi可视化设计的一大补充。当然这个脚本编辑能力是有限制的,比方说不能在脚本任意地添加和删除部件,因为代码和DFM脚本是紧密相连的,任意添加和修改会导致不一致性。但在动态生成的DFM文件中,就不存在这一限制。4s4海岸线网络安全资讯站
  实际上,DFM文件内容是二进制数据,它的脚本是经过Delphi开发环境自动转化的,而且Delphi VCL中的Classes库单元提供了在二进制流中的文件DFM和它的脚本之相互转化的过程。它们是ObjectBinaryToText和ObjectTextToBinary、ObjectResourceToText和ObjectTextToResource。4s4海岸线网络安全资讯站
  ObjectBinaryToText过程将二进制流中存储的部件转化为基于文本的表现形式,这样就可以用文本处理函数进行处理,还可以用文本编辑器进行查找和替代操作,最后可以将文本再转化成二进制流中的部件。4s4海岸线网络安全资讯站
  ObjectTextToBinary过程执行的功能与ObjectBinaryToText相反,将TXT文件转换为二进制流中的部件,而且只要TXT文件内容的书写符合DFM脚本语法,ObjectTextToBinary可将任何程序生成的TXT文件转换为部件,这一功能也为DFM文件的动态生成和编辑奠定了基础。4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
如何在运行过程中将本窗体保存成一个文本格式的.dfm文件?4s4海岸线网络安全资讯站
zswang(伴水) (2001-11-21 9:52:59) 得0分4s4海岸线网络安全资讯站
function ComponentToString(Component: TComponent): string;4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
BinStream: TMemoryStream;4s4海岸线网络安全资讯站
StrStream: TStringStream;4s4海岸线网络安全资讯站
s: string;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
BinStream := TMemoryStream.Create;4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
StrStream := TStringStream.Create(s);4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
BinStream.WriteComponent(Component);4s4海岸线网络安全资讯站
BinStream.Seek(0, soFromBeginning);4s4海岸线网络安全资讯站
ObjectBinaryToText(BinStream, StrStream);4s4海岸线网络安全资讯站
StrStream.Seek(0, soFromBeginning);4s4海岸线网络安全资讯站
Result := StrStream.DataString;4s4海岸线网络安全资讯站
finally4s4海岸线网络安全资讯站
StrStream.Free;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
finally4s4海岸线网络安全资讯站
BinStream.Free4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
end; { ComponentToString }4s4海岸线网络安全资讯站
function StringToComponent(Value: string; Instance: TComponent): TComponent;4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
StrStream: TStringStream;4s4海岸线网络安全资讯站
BinStream: TMemoryStream;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
StrStream := TStringStream.Create(Value);4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
BinStream := TMemoryStream.Create;4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
ObjectTextToBinary(StrStream, BinStream);4s4海岸线网络安全资讯站
BinStream.Seek(0, soFromBeginning);4s4海岸线网络安全资讯站
Result := BinStream.ReadComponent(Instance);4s4海岸线网络安全资讯站
finally4s4海岸线网络安全资讯站
BinStream.Free;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
finally4s4海岸线网络安全资讯站
StrStream.Free;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
end; { StringToComponent }4s4海岸线网络安全资讯站
 4s4海岸线网络安全资讯站
回复人: zswang(伴水) (2001-11-21 9:54:28) 得0分4s4海岸线网络安全资讯站
procedure TForm1.Button1Click(Sender: TObject);4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
Memo1.Text := ComponentToString(Self);4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
 4s4海岸线网络安全资讯站
回复人: zswang(伴水) (2001-11-21 9:58:13) 得0分4s4海岸线网络安全资讯站
procedure TForm1.Button2Click(Sender: TObject);4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
StringToComponent(4s4海岸线网络安全资讯站
'object Label1: TLabel'#13#10 +4s4海岸线网络安全资讯站
' Left = 232'#13#10 +4s4海岸线网络安全资讯站
' Top = 56'#13#10 +4s4海岸线网络安全资讯站
' Width = 26'#13#10 +4s4海岸线网络安全资讯站
' Height = 13'#13#10 +4s4海岸线网络安全资讯站
' Caption = #20320#22909'#13#10 +4s4海岸线网络安全资讯站
' Font.Charset = GB2312_CHARSET'#13#10 +4s4海岸线网络安全资讯站
' Font.Color = clRed'#13#10 +4s4海岸线网络安全资讯站
' Font.Height = -13'#13#10 +4s4海岸线网络安全资讯站
' Font.Name = #23435#20307'#13#10 +4s4海岸线网络安全资讯站
' Font.Style = []'#13#10 +4s4海岸线网络安全资讯站
' ParentFont = False'#13#10 +4s4海岸线网络安全资讯站
'end'#13#10, Label1);4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
//要注册类4s4海岸线网络安全资讯站
==end=================================4s4海岸线网络安全资讯站
好了,理解了上面的这段文字,一些朋友就会自然想到,利用这几个函数应该可以弄出点有用的东西出来,我就弄出了一点应用,并全面应用到了项目中,现在我来给大家完整描述出来:4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
首先我要求我的程序有如下能力:4s4海岸线网络安全资讯站
1. 我的程序的窗体是可以动态替换的,不用编译Exe,只要替换一个DFM窗体设计脚本就可以了(当然,你可以重新包装一下这个DFM文件,比如换成txt后缀名等)。4s4海岸线网络安全资讯站
2. 我可以预览所有的DFM文件,让它变成实际的Form察看。4s4海岸线网络安全资讯站
不要小看这两点,在很多情况下,这意义非常重大,举几个例子①开发阶段,可以把界面设计和程序设计完全分开,分工进行②现场维护时,有些界面的调整和功能设置不需要再找源代码到Delphi下去编译一遍了,老出差做Mis类的朋友应该能从这点体会出好处③某些功能界面的升级简单了不少,只要让用户下载一个DFM文件覆盖原来的就可以了。4s4海岸线网络安全资讯站
好,不费话了,下面详细说明怎么达到以上两点要求。4s4海岸线网络安全资讯站
显然我们要让一段文本变成一个Form,那么就用这个函数:4s4海岸线网络安全资讯站
function StringToComponent(Value: string; Instance:TComponent): TComponent;4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
StrStream:TStringStream;4s4海岸线网络安全资讯站
BinStream: TMemoryStream;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
StrStream := TStringStream.Create(Value);4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
BinStream := TMemoryStream.Create;4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
ObjectTextToBinary(StrStream, BinStream);4s4海岸线网络安全资讯站
BinStream.Seek(0, soFromBeginning);4s4海岸线网络安全资讯站
Result := BinStream.ReadComponent(Instance);4s4海岸线网络安全资讯站
finally4s4海岸线网络安全资讯站
BinStream.Free;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
finally4s4海岸线网络安全资讯站
StrStream.Free;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
但是,所有的Class必须是注册过的,例如,如下的Form1FRM.DFM文件4s4海岸线网络安全资讯站
object Form1: TForm14s4海岸线网络安全资讯站
Left = 2224s4海岸线网络安全资讯站
Top = 1684s4海岸线网络安全资讯站
Width = 4854s4海岸线网络安全资讯站
Height = 2904s4海岸线网络安全资讯站
Caption = 'Form1'4s4海岸线网络安全资讯站
Color = clBtnFace4s4海岸线网络安全资讯站
Font.Charset = DEFAULT_CHARSET4s4海岸线网络安全资讯站
Font.Color = clWindowText4s4海岸线网络安全资讯站
Font.Height = -114s4海岸线网络安全资讯站
Font.Name = 'MS Sans Serif'4s4海岸线网络安全资讯站
Font.Style = []4s4海岸线网络安全资讯站
OldCreateOrder = False4s4海岸线网络安全资讯站
PixelsPerInch = 964s4海岸线网络安全资讯站
TextHeight = 134s4海岸线网络安全资讯站
object Panel1: TPanel4s4海岸线网络安全资讯站
Left = 04s4海岸线网络安全资讯站
Top = 04s4海岸线网络安全资讯站
Width = 4774s4海岸线网络安全资讯站
Height = 334s4海岸线网络安全资讯站
Align = alTop4s4海岸线网络安全资讯站
TabOrder = 04s4海岸线网络安全资讯站
object BitBtn1: TBitBtn4s4海岸线网络安全资讯站
Left = 44s4海岸线网络安全资讯站
Top = 44s4海岸线网络安全资讯站
Width = 754s4海岸线网络安全资讯站
Height = 254s4海岸线网络安全资讯站
Caption = 'OK'4s4海岸线网络安全资讯站
TabOrder = 04s4海岸线网络安全资讯站
end4s4海岸线网络安全资讯站
end4s4海岸线网络安全资讯站
object Memo1: TMemo4s4海岸线网络安全资讯站
Left = 04s4海岸线网络安全资讯站
Top = 334s4海岸线网络安全资讯站
Width = 4774s4海岸线网络安全资讯站
Height = 2304s4海岸线网络安全资讯站
Align = alClient4s4海岸线网络安全资讯站
TabOrder = 14s4海岸线网络安全资讯站
end4s4海岸线网络安全资讯站
end4s4海岸线网络安全资讯站
你应该这么使用,4s4海岸线网络安全资讯站
var list:TstringList;form:TForm4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
list.Lines.LoadFromFile(‘Form1FRM.DFM’);4s4海岸线网络安全资讯站
RegisterClass(TForm1);4s4海岸线网络安全资讯站
RegisterClass(TPanel);4s4海岸线网络安全资讯站
RegisterClass(TBitBtn);4s4海岸线网络安全资讯站
RegisterClass(TMemo);4s4海岸线网络安全资讯站
form := StringToComponent(list.Lines.Text,nil);4s4海岸线网络安全资讯站
form.ShowModal();4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
这样就能显示出一个窗体了。4s4海岸线网络安全资讯站
但是这有个问题,Delphi自带的VCL控件是固定的,用RegisterClass(…)注册一遍没有问题,可TForm1不是,如果连TForm1都要注册的话,就无法达成第2点要求。我们可以变通一下,因为所有的Form都是从Tform继承的,所以,应该都可以用注册Tform来取代,因此,有了下面这样一个函数:4s4海岸线网络安全资讯站
function LoadTextForm(FileName:String):TForm;4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
list:TStrings;4s4海岸线网络安全资讯站
FirstLine:String;4s4海岸线网络安全资讯站
iPos : Integer;4s4海岸线网络安全资讯站
Form : TForm;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
Result := nil;4s4海岸线网络安全资讯站
if FileExists(FileName)=False then4s4海岸线网络安全资讯站
Exit;4s4海岸线网络安全资讯站
Form := TForm.Create(Application);4s4海岸线网络安全资讯站
list := TStringList.Create;4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
list.LoadFromFile(FileName);4s4海岸线网络安全资讯站
if list.Count=0 then4s4海岸线网络安全资讯站
Exit;4s4海岸线网络安全资讯站
FirstLine := list[0];4s4海岸线网络安全资讯站
iPos := Pos(': ',FirstLine);4s4海岸线网络安全资讯站
if iPos = 0 then //找不到': ',格式不对4s4海岸线网络安全资讯站
Exit;4s4海岸线网络安全资讯站
list[0]:=Copy(FirstLine,1,iPos)+' TForm';4s4海岸线网络安全资讯站
DeleteErrorLines(list);4s4海岸线网络安全资讯站
StringToComponent(list.Text,Form);4s4海岸线网络安全资讯站
Result := Form;4s4海岸线网络安全资讯站
except4s4海岸线网络安全资讯站
Form.Free;4s4海岸线网络安全资讯站
Result := nil;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
list.Free;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
原理就是读入DFM文件后把窗体的类别偷换成Tform。其中还有一个函数:4s4海岸线网络安全资讯站
procedure DeleteErrorLines(list:TStrings);4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
i:Integer;4s4海岸线网络安全资讯站
line:String;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
if list.Count=0 then4s4海岸线网络安全资讯站
Exit;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
i:=0;4s4海岸线网络安全资讯站
while i<list.Count do4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
line := Trim(list[i]);4s4海岸线网络安全资讯站
if Copy(line,1,2)='On' then4s4海岸线网络安全资讯站
list.Delete(i)4s4海岸线网络安全资讯站
else4s4海岸线网络安全资讯站
Inc(i);4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
这个函数是把凡是含有“On”开头的行删除,应为在Delphi中,所有控件的事件都是以“On”开头,删除了这样的行,就能保证StringToComponent(list.Text,Form);不出错,用以上的两个函数就可以写一个DFM窗体察看器了,到目前为止,我还没有搜到哪个人发布了DFM窗体察看器。这样我们就完成了第2个要求。4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
实际应用中,一个窗体几乎肯定会有事件处理函数,所以我们要达成第1个要求。我这儿提供了两个方案,各有优缺点:4s4海岸线网络安全资讯站
方案一:4s4海岸线网络安全资讯站
程序员在开发时,在窗体的FormCreate(…)中,用LoadTextForm(…)生成窗体文件,然后把窗体上的控件全部移到本窗体上,最后查找窗体上的控件,动态设置事件处理函数。这个方法要求有一套好的控件命名规则,而且开发比较烦琐,享受不到Delphi的IDE所见即所得,自动生成事件关联代码的好处了。不过对Form文件的制作人员限制很小,他们可以直接用Delphi来制作窗体。4s4海岸线网络安全资讯站
方案二:4s4海岸线网络安全资讯站
用这个函数4s4海岸线网络安全资讯站
procedure ReadForm(aFrom : TComponent;aFileName :string='');4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
FrmStrings : TStrings;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
RegisterClass(TPersistentClass(aFrom.ClassType));4s4海岸线网络安全资讯站
FrmStrings:=TStringlist.Create ;4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
if trim(aFileName)='' then FrmStrings.LoadFromFile( gsPathInfo+''+aFrom.Name+'.txt')4s4海岸线网络安全资讯站
else FrmStrings.LoadFromFile(aFileName);4s4海岸线网络安全资讯站
while aFrom.ComponentCount>0 do aFrom.Components[0].Destroy ;4s4海岸线网络安全资讯站
aFrom:=StringToComponent(FrmStrings.Text,aFrom)4s4海岸线网络安全资讯站
finally4s4海岸线网络安全资讯站
FrmStrings.Free;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
UnRegisterClass(TPersistentClass(aFrom.ClassType));4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
在FormCreate中调用ReadForm(self,…)。4s4海岸线网络安全资讯站
这个方案没有第一个方案的限制,但是要求开发人员必须先完成一个完整的Form文件交给Form文件制作人员, Form文件的制作人员不能修改控件的name,不能添加或删除控件,而且必须保留开发人员给定所有事件处理函数,不能修改函数名。不过很多问题可以写一个Form编辑器来保证不出问题。4s4海岸线网络安全资讯站
具体代码就不写了。4s4海岸线网络安全资讯站
我想,肯定还有跟好的方案来解决动态窗体的问题,希望大家讨论。4s4海岸线网络安全资讯站
(以上代码使用Delphi6编写)4s4海岸线网络安全资讯站
最后,我给出一个我实际项目中的有关动态窗体的函数的Unit4s4海岸线网络安全资讯站
{*****************************************4s4海岸线网络安全资讯站
模块编号:J001DfmFunc4s4海岸线网络安全资讯站
模块名称:Dfm窗体函数集单元4s4海岸线网络安全资讯站
作者:刘爱军4s4海岸线网络安全资讯站
建立日期:2002年12月2日4s4海岸线网络安全资讯站
最后修改日期:4s4海岸线网络安全资讯站
说明:本Unit包含了一些函数,用于根据Delphi窗体文件格式的文件动态创建窗体4s4海岸线网络安全资讯站
*******************************************}4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
unit J001DfmFunc;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
interface4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
uses4s4海岸线网络安全资讯站
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,4s4海岸线网络安全资讯站
Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, Buttons, StdCtrls,4s4海岸线网络安全资讯站
ComCtrls,dbcgrids, buttonComps,Tabs,QryGlobal;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
type4s4海岸线网络安全资讯站
TAllComponentClass = Array of TPersistentClass;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
procedure InitClassType(ClassArray:TAllComponentClass);4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
function ComponentToString(Component: TComponent): string;4s4海岸线网络安全资讯站
function StringToComponent(Value: string; Instance:TComponent): TComponent;4s4海岸线网络安全资讯站
procedure RegisterAllClasses(aAllCmpClass:TAllComponentClass);4s4海岸线网络安全资讯站
procedure UnRegisterAllClasses(aAllCmpClass:TAllComponentClass);4s4海岸线网络安全资讯站
function GetObjectString(list:TStrings;BegLine:Integer=0;TypeString:string=''):string;4s4海岸线网络安全资讯站
function LoadTextForm(FileName:String):TForm;4s4海岸线网络安全资讯站
function LoadTextForm2(FileName:String;out ErrMsg:string):TForm;4s4海岸线网络安全资讯站
procedure DeleteErrorLines(list:TStrings);4s4海岸线网络安全资讯站
procedure ReadForm(aFrom : TComponent;aFileName :string='');4s4海岸线网络安全资讯站
const4s4海岸线网络安全资讯站
RegisteredCompoentClassCount = 32;//数组大小4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
AllCmpClass : TAllComponentClass; //存放控件类4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
implementation4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
//初始化可以解析的类,可随需要增加4s4海岸线网络安全资讯站
procedure InitClassType(ClassArray:TAllComponentClass);4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
SetLength(AllCmpClass,RegisteredCompoentClassCount);4s4海岸线网络安全资讯站
AllCmpClass[0] := TForm;4s4海岸线网络安全资讯站
AllCmpClass[1] := TGroupBox;4s4海岸线网络安全资讯站
AllCmpClass[2] := TPanel;4s4海岸线网络安全资讯站
AllCmpClass[3] := TScrollBox;4s4海岸线网络安全资讯站
AllCmpClass[4] := TLabel;4s4海岸线网络安全资讯站
AllCmpClass[5] := TButton;4s4海岸线网络安全资讯站
AllCmpClass[6] := TBitBtn;4s4海岸线网络安全资讯站
AllCmpClass[7] := TSpeedButton;4s4海岸线网络安全资讯站
AllCmpClass[8] := TStringGrid;4s4海岸线网络安全资讯站
AllCmpClass[9] := TImage;4s4海岸线网络安全资讯站
AllCmpClass[10] := TBevel;4s4海岸线网络安全资讯站
AllCmpClass[11] := TStaticText;4s4海岸线网络安全资讯站
AllCmpClass[12] := TTabControl;4s4海岸线网络安全资讯站
AllCmpClass[13] := TPageControl;4s4海岸线网络安全资讯站
AllCmpClass[14] := TTabSheet;4s4海岸线网络安全资讯站
AllCmpClass[15] := TDBNavigator;4s4海岸线网络安全资讯站
AllCmpClass[16] := TDBText;4s4海岸线网络安全资讯站
AllCmpClass[17] := TDBEdit;4s4海岸线网络安全资讯站
AllCmpClass[18] := TDBMemo;4s4海岸线网络安全资讯站
AllCmpClass[19] := TDBGrid;4s4海岸线网络安全资讯站
AllCmpClass[20] := TDBCtrlGrid;4s4海岸线网络安全资讯站
AllCmpClass[21] := TMemo;4s4海岸线网络安全资讯站
AllCmpClass[22] := TSplitter;4s4海岸线网络安全资讯站
AllCmpClass[23] := TCheckBox;4s4海岸线网络安全资讯站
AllCmpClass[24] := TEdit;4s4海岸线网络安全资讯站
AllCmpClass[25] := TListBox;4s4海岸线网络安全资讯站
AllCmpClass[26] := TComboBox;4s4海岸线网络安全资讯站
AllCmpClass[27] := TDateTimePicker;4s4海岸线网络安全资讯站
AllCmpClass[28] := TImageButton;4s4海岸线网络安全资讯站
AllCmpClass[29] := TTabSet;4s4海岸线网络安全资讯站
AllCmpClass[30] := TTreeView;4s4海岸线网络安全资讯站
AllCmpClass[31] := TListView;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
procedure RegisterAllClasses(aAllCmpClass:TAllComponentClass);4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
i:Integer;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
for i:=0 to RegisteredCompoentClassCount-1 do4s4海岸线网络安全资讯站
RegisterClass(aAllCmpClass[i]);4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
procedure UnRegisterAllClasses(aAllCmpClass:TAllComponentClass);4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
i:Integer;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
for i:=0 to RegisteredCompoentClassCount-1 do4s4海岸线网络安全资讯站
UnRegisterClass(aAllCmpClass[i]);4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
function ComponentToString(Component: TComponent): string;4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
BinStream:TMemoryStream;4s4海岸线网络安全资讯站
StrStream: TStringStream;4s4海岸线网络安全资讯站
s: string;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
BinStream := TMemoryStream.Create;4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
StrStream := TStringStream.Create(s);4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
BinStream.WriteComponent(Component);4s4海岸线网络安全资讯站
BinStream.Seek(0, soFromBeginning);4s4海岸线网络安全资讯站
ObjectBinaryToText(BinStream, StrStream);4s4海岸线网络安全资讯站
StrStream.Seek(0, soFromBeginning);4s4海岸线网络安全资讯站
Result:= StrStream.DataString;4s4海岸线网络安全资讯站
finally4s4海岸线网络安全资讯站
StrStream.Free;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
finally4s4海岸线网络安全资讯站
BinStream.Free4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
function StringToComponent(Value: string; Instance:TComponent): TComponent;4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
StrStream:TStringStream;4s4海岸线网络安全资讯站
BinStream: TMemoryStream;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
StrStream := TStringStream.Create(Value);4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
BinStream := TMemoryStream.Create;4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
ObjectTextToBinary(StrStream, BinStream);4s4海岸线网络安全资讯站
BinStream.Seek(0, soFromBeginning);4s4海岸线网络安全资讯站
Result := BinStream.ReadComponent(Instance);4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
finally4s4海岸线网络安全资讯站
BinStream.Free;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
finally4s4海岸线网络安全资讯站
StrStream.Free;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
function GetObjectString(list:TStrings;BegLine:Integer=0;TypeString:string=''):string;4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
i,iBegCount,iEndCount:Integer;4s4海岸线网络安全资讯站
ObjString,Line,ClassStr:String;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
iBegCount:=0;4s4海岸线网络安全资讯站
iEndCount:=0;4s4海岸线网络安全资讯站
ClassStr := Trim(UpperCase(TypeString));4s4海岸线网络安全资讯站
for i:=BegLine to list.Count-1 do4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
line := UpperCase(list[i]);4s4海岸线网络安全资讯站
if Pos('OBJECT',line)>0 then4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
if (TypeString='') or (Pos(': '+ClassStr,line)>0) then4s4海岸线网络安全资讯站
Inc(iBegCount);4s4海岸线网络安全资讯站
end4s4海岸线网络安全资讯站
else if (iBegCount>iEndCount) and (trim(line)='END') then4s4海岸线网络安全资讯站
Inc(iEndCount);4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
if iBegCount>0 then4s4海岸线网络安全资讯站
Result := Result + list[i] + #13#10;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
if (iBegCount>0) and (iBegCount=iEndCount) then4s4海岸线网络安全资讯站
Exit;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
procedure DeleteErrorLines(list:TStrings);4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
i:Integer;4s4海岸线网络安全资讯站
line:String;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
if list.Count=0 then4s4海岸线网络安全资讯站
Exit;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
i:=0;4s4海岸线网络安全资讯站
while i<list.Count do4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
line := Trim(list[i]);4s4海岸线网络安全资讯站
if Copy(line,1,2)='On' then4s4海岸线网络安全资讯站
list.Delete(i)4s4海岸线网络安全资讯站
else4s4海岸线网络安全资讯站
Inc(i);4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
procedure ReadForm(aFrom : TComponent;aFileName :string='');4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
FrmStrings : TStrings;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
RegisterClass(TPersistentClass(aFrom.ClassType));4s4海岸线网络安全资讯站
FrmStrings:=TStringlist.Create ;4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
if trim(aFileName)='' then FrmStrings.LoadFromFile( gsPathInfo+''+aFrom.Name+'.txt')4s4海岸线网络安全资讯站
else FrmStrings.LoadFromFile(aFileName);4s4海岸线网络安全资讯站
while aFrom.ComponentCount>0 do aFrom.Components[0].Destroy ;4s4海岸线网络安全资讯站
aFrom:=StringToComponent(FrmStrings.Text,aFrom)4s4海岸线网络安全资讯站
finally4s4海岸线网络安全资讯站
FrmStrings.Free;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
UnRegisterClass(TPersistentClass(aFrom.ClassType));4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
function LoadTextForm(FileName:String):TForm;4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
list:TStrings;4s4海岸线网络安全资讯站
FirstLine:String;4s4海岸线网络安全资讯站
iPos : Integer;4s4海岸线网络安全资讯站
Form : TForm;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
Result := nil;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
if FileExists(FileName)=False then4s4海岸线网络安全资讯站
Exit;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
Form := TForm.Create(Application);4s4海岸线网络安全资讯站
list := TStringList.Create;4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
list.LoadFromFile(FileName);4s4海岸线网络安全资讯站
if list.Count=0 then4s4海岸线网络安全资讯站
Exit;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
FirstLine := list[0];4s4海岸线网络安全资讯站
iPos := Pos(': ',FirstLine);4s4海岸线网络安全资讯站
if iPos = 0 then //找不到': ',格式不对4s4海岸线网络安全资讯站
Exit;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
list[0]:=Copy(FirstLine,1,iPos)+' TForm';4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
DeleteErrorLines(list);4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
StringToComponent(list.Text,Form);4s4海岸线网络安全资讯站
Result := Form;4s4海岸线网络安全资讯站
except4s4海岸线网络安全资讯站
Form.Free;4s4海岸线网络安全资讯站
Result := nil;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
list.Free;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
function LoadTextForm2(FileName:String;out ErrMsg:string):TForm;4s4海岸线网络安全资讯站
var4s4海岸线网络安全资讯站
list:TStrings;4s4海岸线网络安全资讯站
FirstLine:String;4s4海岸线网络安全资讯站
iPos : Integer;4s4海岸线网络安全资讯站
Form : TForm;4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
Result := nil;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
if FileExists(FileName)=False then4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
ErrMsg := '无效的文件名!';4s4海岸线网络安全资讯站
Exit;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
Form := TForm.Create(Application);4s4海岸线网络安全资讯站
list := TStringList.Create;4s4海岸线网络安全资讯站
try4s4海岸线网络安全资讯站
list.LoadFromFile(FileName);4s4海岸线网络安全资讯站
if list.Count=0 then4s4海岸线网络安全资讯站
Exit;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
FirstLine := list[0];4s4海岸线网络安全资讯站
iPos := Pos(': ',FirstLine);4s4海岸线网络安全资讯站
if iPos = 0 then //找不到': ',格式不对4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
ErrMsg := '找不到'': '',文件格式不对';4s4海岸线网络安全资讯站
Exit;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
list[0]:=Copy(FirstLine,1,iPos)+' TForm';4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
DeleteErrorLines(list);4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
StringToComponent(list.Text,Form);4s4海岸线网络安全资讯站
Result := Form;4s4海岸线网络安全资讯站
except4s4海岸线网络安全资讯站
on e:exception do4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
Form.Free;4s4海岸线网络安全资讯站
Result := nil;4s4海岸线网络安全资讯站
ErrMsg := '读入文件错误:'+e.Message;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
list.Free;4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
4s4海岸线网络安全资讯站
initialization4s4海岸线网络安全资讯站
begin4s4海岸线网络安全资讯站
InitClassType(AllCmpClass);4s4海岸线网络安全资讯站
RegisterAllClasses(AllCmpClass);4s4海岸线网络安全资讯站
end;4s4海岸线网络安全资讯站
4s4海岸线网络安全<