我创建了我自己的组件:TPage,它包含子组件TPaper(TPanel)。 问题是,当我在TPaper(填满几乎整个区域)上放置TMemo或TButton等控件时,控件根本无法加载。见下面的例子为什么复合组件无法使用父级控件?
TPaper = class(TPanel)
protected
constructor Create(AOwner: TComponent);override;
destructor Destroy;override;
public
procedure Paint; override;
end;
TPage = class(TCustomControl)
private
FPaper:TPaper;
protected
procedure CreateParams(var Params:TCreateParams); override;
public
constructor Create(AOwner: TComponent);override;
destructor Destroy;override;
published
property Paper: TPaper read FPaper write FPaper;
end;
constructor TPage.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
PaperOrientation:=poPortrait;
PaperSize:=psA4;
PaperBrush:=TBrush.Create;
PaperBrush.Color:=clWhite;
PDFDocument:=Nil;
FPaper:=TPaper.Create(Self);
FPaper.Parent:=Self;
FPaper.SetSubComponent(True);
end;
... Memo1在TPaper(TPanel)在设计时父,但 后按“运行”,它不存在。
procedure TForm1.btn1Click(Sender: TObject);
begin
if not Assigned(Memo1) then ShowMessage('I do not exist'); //Memo1 is nil
end;
你知道怎么回事吗?
非常感谢
P.S Delphi 7中
当我把TMemo内部TPaper并保存单元(1单元),相关联的DFM文件的检查之后,没有TMemo部件的痕迹。 (这就是为什么它不能加载到应用程序。)
感谢您的回答。我试图将这个代码片段实现到我的代码中,但它并不像我预期的那样工作。在TPaper内部插入的组件根本不会出现在dfm文件中。 我在帮助中找到了TComponentStyle: csSubComponent \t该组件是组件的子组件,它是其所有者属性的值。与顶层组件不同,子组件不会与它们所在的表单或数据模块一起保存。相反,子组件显示为其所有者已发布属性的值,其已发布的属性和事件将保存在拥有该组件的表单文件中。 – lyborko 2010-04-20 11:49:55
我猜想,我不能指望在TPaper中插入的任何TWinCOntrol都会保存在dfm文件中。 – lyborko 2010-04-20 11:51:53
如何将备忘录插入Tpaper?如果你这样做: AMemo:= Tmemo.create(FPaper)那么很明显,它不会流入dfm。试试AMemo:= TMemo.create(MyPage),看看它是否有效。 – iamjoosy 2010-04-20 13:35:03