[求救]如何根据DFM文件获得对象的属性?(100分)

  • 主题发起人 主题发起人 Rocklee
  • 开始时间 开始时间
R

Rocklee

Unregistered / Unconfirmed
GUEST, unregistred user!
输入一个设计时的DFM文件,如Unit1.DFM,如何从中获得从Form1到各层控件的各个属性及其设计时的值?
是不是要要用到Toolsapi?请高手指点一二,如果成功解决,再加分也可以!!
 
DFM 文件其实是一个文本文件,里面的属性及值都是明文记录的,直接分析就可以了。
 
但是里面的结构很复杂,有树状的分枝结构,但分枝结构不统一,很难把握。
还有别的办法吗?比如用toolsapi里的什么formdesiner之类。
 
所需知识都在unit classes中,关键在TReader
 
铁盒子,有没有例子?
诚心听课。
 
function ComponentToString(Component: TComponent): string;

var
BinStream:TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(Component);
BinStream.Seek(0, soFromBeginning);
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFromBeginning);
Result:= StrStream.DataString;
finally
StrStream.Free;

end;
finally
BinStream.Free
end;
end;

function StringToComponent(Value: string): TComponent;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result := BinStream.ReadComponent(nil);

finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;

参见ObjectBinaryToText的帮助和例子。
----
www.kicoy.com
 
谢谢magicgod的热情回复,这个方法我也想过,但是要知道Result := BinStream.ReadComponent(nil);之前,当XXXX没注册的时候,一定先要RegisterClass(XXXX),不然就会报错,这个你比我更清楚。

但是我是想分析本身程序之外的一些dfm的对象结构,并显示其属性,要分析的dfm里面加载哪些class,用了哪些第三方vcl我都不能确定,用RegisterClass(XXXX)绝对行不通,不知道magicgod是否同意我的看法。


欢迎各位同学继续讨论。
 
扫描不同的控件,然后注册一下就行了。注册应该不算复杂的,看看源码就差不多了。

如果用解析的话也不复杂,可以直接字符串处理,也可以转成xml再处理。
---
www.kicoy.com
 
RegisterClass是不行的,因为我总不能收罗天下vcl在我的程序里(难道还有通用RegisterClass的方法?),而我最终的想法是让我的程序编译后能分析所有dfm文件。

至于转成xml再处理,但由于树枝(姑且把整个FORM看作树)分支的标志不统一等问题,不知怎么整,听课中...
 
RegisterClass并不太复杂,看看源码参照一下就行。

解析的话也不会太复杂,看一下ObjectTextToBinary的源码,就是如何来解析dfm文件的,在classes.pas里。
---
www.kicoy.com
 
谢谢magicgod的回复,我在此举一例,以说明我上面的问题:
比如,我的程序叫proj1.exe,完成的功能是接受参数labeledit1.text指向的dfm文件,然后分析里面的对象,把所有对象的名称及caption等属性加入listview的items中。
问题来了:因为我的proj1.exe已经编译完成,拿到别的地方用,而使用者在label1.text中输入的dfm文件中含有一对象为txpmenu的第三方控件,我的proj1.exe就会出错,因为proj1编译时没有包括txpmenu这个类。[^]
 
如果是仅仅名称之类,就直接扫描一下dfm文件就行了。扫描方法参照ObjectTextToBinary
---
www.kicoy.com
 
除了要拿到他的名称,还要拿到caption,text之类的基本属性呀。。。[^]
 
听说你研究TCPServer的反弹已经成功了。有兴趣研究一下http隧道吗?

http://www.sxsoft.com/project/project_view.asp?proid=18039

跟这个差不多
 
后退
顶部