2010-06-15 39 views
2

我想創建一個自定義控件(TRichEdit的後裔)。 我只是想在editfield上面添加一些文字。德爾福自定義控件:TRichEdit與TLabel上面它

我已經創建了自己的控件,並重寫了構造函數來爲標題創建一個TLabel。 它的作品,但我的問題:如何將標籤上移動標籤? 當我設置頂部:= -5時,標籤開始失望。

這裏的構造函數的代碼:

constructor TDBRichEditExt.Create(AOwner: TComponent); 
begin 
    inherited; 
    lblCaption := TLabel.Create(self); 
    lblCaption.Parent := parent; 
    lblCaption.Caption := 'Header'; 
    lblCaption.Top := -5; 
end; 

我認爲這是邏輯,既然RichEdit的標籤disappaers是父。 我試過

lblCaption.Parent := self.parent; 

爲了使該公司擁有的richedit父形式 - 但這不到風度工作...

我怎麼能做到這一點? 謝謝大家!

+6

你看過* ExtCtrls *單元中的['TLabeledEdit'](http://docwiki.embarcadero.com/VCL/en/ExtCtrls.TLabeledEdit)控件嗎?它應該顯示*完全*如何做你以後的事情。 – 2010-06-15 16:07:09

+3

羅布肯尼迪是對的。 TLabeledEdit是一個帶有TLabel的TEdit。這是此過程的標準示例。閱讀源代碼並學習。如果你想要更多的解釋,請閱讀下面的答案(另外)。 – 2010-06-15 16:22:11

回答

9

我認爲這是邏輯,既然RichEdit的標籤 disappaers是 父

這是不對的。在您的代碼中,TLabel的父級是TDBRichEditExt的父級,因爲它應該是。注意,在TDBRichEditExt的方法中,ParentSelf.Parent是相同的事物。 如果您想要TLabel的父母爲TDBRichEditExt本身 - 您的不是 - 那麼您應該設置lblCaption.Parent := self;

現在,如果TLabel的父母是TDBRichEditExt的父母,那麼TLabelTop財產是TDBRichEditExt的父母,而不是到TDBRichEditExt本身。因此,如果TDBRichEditExt的父親是TForm,那麼Top := -5意味着TLabel將被定位在高於的五個像素上的形式的上邊緣。你的意思是

lblCaption.Top := Self.Top - 5; 

但-5是一個太小的數字。你真正應該使用的是

lblCaption.Top := Self.Top - lblCaption.Height - 5; 

它還在標籤和Rich Edit之間產生5 px的空間。

此外,你想

lblCaption.Left := Self.Left; 

另一個問題

但是,這是行不通的,因爲在當時被創建的組件,我不認爲家長已設置但。因此,您需要在更合適的時間進行標籤的定位。此外,每次移動組件時都會移動標籤,這非常重要!

TDBRichEditExt = class(TRichEdit) 
private 
    FLabel: TLabel; 
    FLabelCaption: string; 
    procedure SetLabelCaption(LabelCaption: string); 
public 
    constructor Create(AOwner: TComponent); override; 
    procedure SetBounds(ALeft: Integer; ATop: Integer; AWidth: Integer; AHeight: Integer); override; 
published 
    LabelCaption: string read FLabelCaption write SetLabelCaption; 
end; 

procedure TDBRichEditExt.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); 
begin 
    inherited; 
    if not assigned(Parent) then 
    Exit; 
    FLabel.Parent := self.Parent; 
    FLabel.Top := self.Top - FLabel.Height - 5; 
    FLabel.Left := self.Left; 
end; 

詳細

此外,當你隱藏TDBRichEditExt,你要隱藏的標籤爲好。因此,你需要

protected 
    procedure CMVisiblechanged(var Message: TMessage); message CM_VISIBLECHANGED; 

其中

procedure TDBRichEditExt.CMVisiblechanged(var Message: TMessage); 
begin 
    inherited; 
    if assigned(FLabel) then 
    FLabel.Visible := Visible; 
end; 

而同樣爲Enabled屬性,還需要每個TDBRichEditExt的父被改變的時間來更新TLabel的父:

protected 
    procedure SetParent(AParent: TWinControl); override; 

procedure TDBRichEditExt.SetParent(AParent: TWinControl); 
begin 
    inherited; 
    if not assigned(FLabel) then Exit; 
    FLabel.Parent := AParent; 
end; 
+0

很好的答案,非常感謝你的詳細信息和你的努力來解釋它! – doubleu 2010-06-16 06:17:21

+0

還有比Andreas解釋過的更好(非常好,必須說是+1),請參閱ExtCtrls.pas中的TLabeledEdit源代碼。例如,表單通知處理。 – 2010-06-16 18:57:10