2016-11-23 12 views
3

TCustomPanelから派生したコンポーネントを定義しましたが、誤って他のコントロールを誤って追加することがありました。TCustomPanelから派生したコンポーネントにコントロールが追加されないようにするにはどうすればいいですか?

ランタイム:

TMyPanel = class(TCustomPanel) 
    public 
    //... 
    end; 

設計時:

procedure Register(); 
begin 
    RegisterCustomModule(TCustomPanel, TCustomModule); 
    RegisterComponents('MyTestComponents', [ 
    TMyPanel 
    ]); 
end; 

私はインストールして、誤ってその中に他のコントロールを追加することができ、私のコンポーネントを使用しています誰がそれを望んでいません。 フォーム/フレームの直接子供の場合、コントロールがコンポーネントに追加されないようにするにはどうすればいいですか?

手順動作を再現する:

  1. TMyPanelが選択されている間に新しいフォームを作成し

に新しいコントロールを別のコントロールを追加し、TMyPanel

  • が追加されますパネルの内側に追加してください。

  • +2

    TPanelはコンテナなので、これは正常な動作です。このような状況であなたのパネルは何をしたいですか?設計時や実行時にサブコンポーネントを追加したくないと言っていますか? – Dsm

    +0

    @Dsm:パネル自体をデザインする際に、パネル内に他のコントロールを配置したいと考えています。しかし、フォーム/フレーム内のコンポーネントとしてパネルを使用する場合、パネル内に他のコントロールを配置することはできません。 – ExDev

    +0

    @ExDev:それは実際には意味がありません。パネルは設計時に常にフォーム/フレーム内にあります。パネルがフォーム/フレームの*直接*子であるときにコントロールを無視したいが、別のコントロールの子であるときにコントロールを受け入れることを希望しない限り、その場合は、1) 'SetParent()'メソッドをオーバーライドし、割り当てられている 'Parent'の型に基づいて' ControlStyle'プロパティの 'csAcceptsControls'フラグをトグルするか、または2) ValidateInsert() 'メソッドを呼び出し、現在の' Parent'がForm/Frameの場合は例外をスローします。 –

    答えて

    4

    おそらく(上書きすることができます)最も簡単な方法は、そのコンストラクタでcontrolStyle要素を設定することで、この

    よう
    interface 
    
    uses 
        VCL.ExtCtrls, 
        VCL.Controls, 
        System.Classes; 
    
    type 
    TMyPanel = class(TCustomPanel) 
        public 
        constructor Create(AOwner: TComponent); override; 
        end; 
    
    implementation 
    
    { TMyPanel } 
    
    constructor TMyPanel.Create(AOwner: TComponent); 
    begin 
        inherited; 
        // ... 
        ControlStyle := ControlStyle - [ csAcceptsControls ]; 
    end; 
    

    あなたがデザイン時にこの動作を変更できるようにしたい場合、あなたはまた、希望ControlStyleプロパティを公開します。

    関連する問題