Я думаю, что это логично, что лейбл
разочаровывает, так как богатство является
Родитель
Это неправильно. В вашем коде родительский элемент TLabel
является родительским элементом TDBRichEditExt
, как и должно быть. Обратите внимание, что в методе TDBRichEditExt
, Parent
и Self.Parent
это одно и то же. Если вы хотите, чтобы родителем TLabel
был сам TDBRichEditExt
- что вы делаете , а не - тогда вы должны установить lblCaption.Parent := self;
.
Теперь, если родительский элемент TLabel
является родительским для TDBRichEditExt
, то свойство Top
TLabel
относится к родительскому элементу TDBRichEditExt
, а не к самому TDBRichEditExt
. Следовательно, если родительский элемент TDBRichEditExt
является TForm
, то Top := -5
означает, что TLabel
будет расположен на пять пикселей над верхним краем формы. Вы имеете в виду
lblCaption.Top := Self.Top - 5;
Но -5 слишком мало. То, что вы действительно должны использовать, это
lblCaption.Top := Self.Top - lblCaption.Height - 5;
, кроме того, между меткой и Rich Edit остается пространство в 5 пикселей.
Кроме того, вы хотели бы
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
вам также необходимо обновлять родительский элемент TLabel
каждый раз, когда изменяется родительский элемент TDBRichEditExt
:
protected
procedure SetParent(AParent: TWinControl); override;
с
procedure TDBRichEditExt.SetParent(AParent: TWinControl);
begin
inherited;
if not assigned(FLabel) then Exit;
FLabel.Parent := AParent;
end;