2015-11-20 29 views
6

Ho un componente composito costituito da un TEdit e un TButton (sì, so di TButtonedEdit) che eredita da TCustomControl. La modifica e il pulsante sono creati nel suo costruttore e posizionati su se stesso.Casella di selezione del componente composito non disegnata correttamente

In fase di progettazione, la casella di selezione non viene disegnata correttamente, suppongo che la modifica e il pulsante lo nascondano perché sono stati disegnati per il controllo personalizzato e poi sono stati cancellati da essi.

Ecco il confronto:

enter image description here

Ho visto anche questo per gli altri componenti 3rd party (come il TcxGrid anche disegna solo la parte esterna del indicatore di selezione)

Domanda: come può Lo cambio?

caso più semplici per la riproduzione:

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

Quale versione di Delphi, nel caso in cui conta –

+0

Ma non credo che si sta per avere fortuna. Penso che gli indicatori di selezione siano implementati dall'IDE che aggancia le procedure della finestra di controllo. E il tuo controllo è dipinto prima dei suoi figli. –

+0

Probabilmente il modo più semplice, in cima alla mia testa, è quello di impostare la propria pittura per il tempo di progettazione. – Graymatter

risposta

3

Come ho detto nei commenti, la cosa più semplice che posso pensare è quello di dipingere i controlli nel genitore e "nascondere" loro dal progettista in fase di progettazione . È possibile farlo chiamando SetDesignVisible(False) su ciascuno dei controlli figlio. Quindi usi PaintTo per fare il dipinto sul genitore.

Usando il tuo esempio otteniamo:

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;