如何在运行时读取窗体资源中的属性?(200分)

  • 主题发起人 主题发起人 Adnil
  • 开始时间 开始时间
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
就像窗体创建的时候会自动读取保存在资源文件中的Form设计定义一样,

现在知道窗体资源保存在RCData段中,但不知道如何实现,例如获得TForm1.Button1的Caption属性值。

请问有没有什么好方法?
 
Delphi 有一个自带的查看资源的例子——ResXplor。

然后有一个现成的转换资源的流可以用,有几个类似的函数
ReadComponentRes
ObjectTextToResource

很久以前,在CSDN回答过一个类似问题,时间长忘了。现在也查不到了。

《delphi高级开发指南》上有关于这方面的讲述。如何读取FORM文件并把他转换成窗体或列出被保存了属性值
 
这是DELPHI自带的一个例子,
读窗体和它差不多。以后的工作就是从字符串中得到你要的值。
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;
 
类似的我知道,从文件,从流读取Component,但是如何从资源呢?这是我所关注的。
 
procedure TMainForm.UpdateViewPanel;
var
R: TResourceItem;
begin
with TreeView do
begin
if Visible and Assigned(Selected) then
begin
R := TResourceItem(Selected.Data);
if R.IsList then UpdateListView(R.List) else
begin
case R.ResType of
rtBitmap, rtIconEntry, rtCursorEntry:
begin
ImageViewer.Picture.Assign(R);
Notebook.PageIndex := 1;
end;
rtString, rtMenu:
begin
StringViewer.Lines.Assign(R);
StringViewer.SelStart := 0;
Notebook.PageIndex := 2;
end
else
begin
HexDump.Address := R.RawData; //////////////////////////如这里读入一个流中
HexDump.DataSize := R.Size;
Notebook.PageIndex := 3;
end;
end;
end;
UpdateStatusLine(R);
end;
end;
end;

上面是DELPHI中例子的代码。只要在CASE中加入RCDATA类型,如上面的注释处读到一个流里
这个流再用类似ObjectBinaryToText这个函数(可能还需要额外的一两个函数先转换一下)
转换成一个字符串流(这个流的格式和dfm文件格式是一样的),然后就是字符串的解析了。
 
在帮助中输入ObjectBinaryToText,然后再看相关的主题,就可以找到所有关于资源转换的函数
 
我找不到什么资源转换的函数啊,我为什么要去找资源转换的? 我现在只要读取就行了。

例如读取TForm1的Button1的属性'Caption'在资源文件中所存储的值!
 
我开始很奇怪,如何能直接读RCDATA? 刚才看了一下,发现现在的RCDATA中居然存放的不是二进制数据,而是ASC码的数据
我记得在D3中是用二进制方式存储的。如果这样的话倒也省略了转化的麻烦,不过我想如果想直接读获得TForm1.Button1的Caption。
并没有什么更快捷的方式,因为delphi也是通过ObjectBinaryToText这一类的函数来工作的。而且估计DELPHI也不会提供各个击破的函数
只会提供一揽子解决函数,程序运行时,它没有必要一个组件,一个组件的读,它可以将一个窗体直接创建出来。

要不你就看看TREADER这个类,也许他提供了较为快捷的办法。
 
后退
顶部