情况是这样的:
首先,我在单元文件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控件。
请问该怎么办?谢谢!
首先,我在单元文件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控件。
请问该怎么办?谢谢!
你那两个按钮单击事件里的代码是关键
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 }
-------------------------
如果是我我绝对不会这样干:
首先,这是给自己找麻烦;
再就是不方便代码阅读。其实你只要将动态创建的组件的 ClientRect 几个要素(例如 Top/Left等等)保存起来,动态创建时候加载就好了,简单而且清晰。