2015-11-20 28 views
6

TCustomControlを継承するTEditTButton(はい、私は約TButtonedEditを知っています)からなる複合コンポーネントがあります。編集とボタンはコンストラクタで作成され、それ自体に配置されます。複合コンポーネントの選択ボックスが正しく描画されない

選択ボックスが適切に描画されていません - 私の推測では、編集とボタンがカスタムコントロール用に描画されてから隠されているためです。ここで

比較:私も他のサードパーティのコンポーネントのためにこれを見ている

enter image description here

質問(TcxGridのようにも唯一の選択インジケータの外側部分を描く):どのようにすることができます私はそれを変える?再生する

ほとんどの単純なケース:

unit SearchEdit; 

interface 

uses 
    Classes, Controls, StdCtrls; 

type 
    TSearchEdit = class(TCustomControl) 
    private 
    fEdit: TEdit; 
    public 
    constructor Create(AOwner: TComponent); override; 
    end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('Custom', [TSearchEdit]); 
end; 

{ TSearchEdit } 

constructor TSearchEdit.Create(AOwner: TComponent); 
begin 
    inherited; 
    fEdit := TEdit.Create(Self); 
    fEdit.Parent := Self; 
    fEdit.Align := alClient; 
end; 

end. 
+0

はどのデルファイのバージョン、場合、それは –

+0

重要しかし、私はあなたがすべての運を持ってしようとしているとは思いません。私は選択インジケータがコントロールウィンドウプロシージャをフックするIDEによって実装されていると思います。あなたのコントロールは子供の前に塗られています。 –

+0

おそらく私の頭の上から一番簡単なのは、デザイン時に自分の絵を設定することです。 – Graymatter

答えて

3

私がコメントで言ったように、私は考えることができる最も簡単な方法は、設計時に親のコントロールをペイントデザイナーからそれらを「隠す」ことです。これを行うには、子コントロールのそれぞれにSetDesignVisible(False)を呼び出します。次に、PaintToを使用して親に絵を描きます。

はあなたの例を使用して、我々が得る:

type 
    TSearchEdit = class(TCustomControl) 
    ... 
    protected 
    procedure Paint; override; 
    ... 
    end; 

constructor TSearchEdit.Create(AOwner: TComponent); 
begin 
    inherited; 
    fEdit := TEdit.Create(Self); 
    fEdit.Parent := Self; 
    fEdit.Align := alClient; 
    fEdit.SetDesignVisible(False); 
end; 

procedure TSearchEdit.Paint; 
begin 
    Inherited; 
    if (csDesigning in ComponentState) then 
    fEdit.PaintTo(Self.Canvas, FEdit.Left, FEdit.Top); 
end; 
関連する問題