2015-11-20 75 views
6

我有一個由TEditTButton的複合材料部件(是的,我知道TButtonedEdit)從TCustomControl繼承。編輯和按鈕在其構造函數中創建並置於其自身上。選擇框不繪製正確

在設計時候選擇框沒有正確繪製 - 我的猜測是編輯和按鈕隱藏它,因爲它被繪製爲自定義控件,然後透過它們透支。

這裏比較:

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;