周末了,问题却没解决,delphi的窗体文件动态保存dfm问题,帮忙吧

2540546520 2010-07-31 03:13:02
情况是这样的:
首先,我在单元文件Unit1.Pas自己写了一个控件:例如:
TAPanel=class(TPanel);
FGroupBox:TGroupBox;
FBtnCheck:TButton;
constructor Create(AOwner: TComponent);override;
destructor Destroy; override;
end;

然后,我在窗体文件Unit2调用Unit1.Pas中的控件TAPanel
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormShow(Sender: TObject);
private
FType:TAPanel;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
FType:=TAPanel.Create(self);
FType.Parent:=Self;
end;
这样,当Form1运行时,就会产生我自定义的Panel了吧
最后,我想实现当Form1运行时候,点击Button1保存Form1窗体,然后点击Button2,可以将保存好的窗体重新显示。

但是保存Form1时却出现了问题,其中保存的dfm文件的TAPanel部分是这样的:
object TAPanel
Left = 100
Top = 80
Width = 360
Height = 250
TabOrder = 4
end

那么我保存了,但是取出来要显示的时候delphi却不认识这个TAPanel控件。
请问该怎么办?谢谢!
...全文
128 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
2540546520 2010-08-02
  • 打赏
  • 举报
回复
2540546520 2010-08-02
  • 打赏
  • 举报
回复
谢谢大家 问题已经解决!
Frank.WU 2010-08-02
  • 打赏
  • 举报
回复
除非特殊必要,以下可以忽略不看:
-------------------------
如果是我我绝对不会这样干:
首先,这是给自己找麻烦;
再就是不方便代码阅读。

其实你只要将动态创建的组件的 ClientRect 几个要素(例如 Top/Left等等)保存起来,动态创建时候加载就好了,简单而且清晰。
2540546520 2010-08-02
  • 打赏
  • 举报
回复
楼主补充:我有注册过了
RegisterClasses([TButton,TLabel,TRadioButton,TPageControl,TTabSheet,TGroupBox,TPLCType,TMemo]);
以下是转换函数:
function TConvesion.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; { ComponentToString }
function TConvesion.StringToComponent(Value: string; Instance: TComponent): 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(Instance);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end; { StringToComponent }
newfang 2010-08-01
  • 打赏
  • 举报
回复
要注册这个类吧·~?

把按钮里代码贴出来look look
taxi 2010-08-01
  • 打赏
  • 举报
回复
是说class TAPanel not found吗,应该要调用RegisterClasses或RegisterClass(名字忘了)注册吧。
亮剑_ 2010-07-31
  • 打赏
  • 举报
回复
dfm文件不完全是文本文件
你那两个按钮单击事件里的代码是关键
dinoalex 2010-07-31
  • 打赏
  • 举报
回复
能看一下你的保存和重导的代码吗?

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧