情况是这样的:
首先,我在单元文件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控件。
请问该怎么办?谢谢!

解决方案 »

  1.   

    dfm文件不完全是文本文件
    你那两个按钮单击事件里的代码是关键
      

  2.   

    要注册这个类吧·~?把按钮里代码贴出来look look
      

  3.   

    是说class TAPanel not found吗,应该要调用RegisterClasses或RegisterClass(名字忘了)注册吧。
      

  4.   

    楼主补充:我有注册过了
      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 }
      

  5.   

    除非特殊必要,以下可以忽略不看:
    -------------------------
    如果是我我绝对不会这样干:
    首先,这是给自己找麻烦;
    再就是不方便代码阅读。其实你只要将动态创建的组件的 ClientRect 几个要素(例如 Top/Left等等)保存起来,动态创建时候加载就好了,简单而且清晰。