2016-07-03 4 views
1

TRectangleを含むTLayoutで構成されたコンポーネントを作成したいとします。ALT-F12を2回押しても重複するサブコンポーネントが作成されないようにするにはどうすればよいですか?

TRectangleは、コンポーネントのコンストラクタの内部で作成され、TLayoutをその親としています。

問題:フォームにこのコンポーネントを配置するときに、フォームのソースエディタを入力するためにALT-F12を押してからもう一度押すと、親の余分な子コンポーネント(TRectangle)が作成されます。コンポーネントの

コード(TRectangleでも、私が問題になると思われ、フォームのテキストエディタで表示されません):

unit Problem; 

interface 

uses 
    System.SysUtils, System.Classes, FMX.Types, FMX.Layouts, FMX.Objects; 

type 
    TProblem = class(TLayout) 
    private 
    rect: TRectangle; 
    public 
    constructor Create(AOwner: TComponent); override; 
    end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('FMX Problem Component', [TProblem]); 
end; 

{ TProblem } 

constructor TProblem.Create(AOwner: TComponent); 
begin 
    inherited; 
    rect := TRectangle.Create(nil); 
    rect.Parent := Self; 
end; 

end. 

を私は答えは自明であると確信しているが、それをいただければ幸いですそれにもかかわらず。 = RECTのための偽:ストアド

+1

公開しないでください。親の保護されたセクションまたはプライベートセクションにある場合は、そのクラスの外部で使用できないようにして、ツリーに表示しません。 –

+0

親のプライベートセクションにあります。奇妙なことは、コンポーネントをフォームに配置すると表示されませんが、フォームにそのようなコンポーネントを含むプロジェクトをロードすると構造ツリーに表示されることです。 – Domus

+0

私はひどく間違ったことをしているに違いない。フォームのソースを表示するためにAlt-F12を押し、それを残すためにAlt-F12を押すたびに、TRectangleの新しいインスタンスが作成されます。 – Domus

答えて

1

使用

constructor TProblem.Create(AOwner: TComponent); 
begin 
    inherited; 
    rect := TRectangle.Create(nil); 
    rect.Parent := Self; 
    rect.Stored := False 
end; 

SetSubcomponentは、FireMonkeyの中で正しく処理されているようです。

関連する問題