我創建了我自己的組件: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