Delphi自定义控件:一个带有TLabel的TRichEdit

时间:2010-06-15 15:31:51

标签: delphi controls

我想创建一个自定义控件(TRichEdit的后代)。 我只想在编辑区上方添加一些文字。

我已经创建了自己的控件,并覆盖了构造函数,为标题创建了一个TLabel。 它有效,但我的问题是:如何将标签移到richedit上面? 当我设置Top:= -5时,标签开始变得令人失望。

这是构造函数的代码:

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

我认为标签令人失望,因为richedit是父母。 我试过了

lblCaption.Parent := self.parent;

要使拥有richedit的表单成为父级 - 但这不起作用......

我怎么能实现这个目标? 谢谢大家!

1 个答案:

答案 0 :(得分:9)

  

我认为这是标签的逻辑   自从这个时代以来,人们就失望了   父

这是错误的。在您的代码中,TLabel的父级是TDBRichEditExt的父级,应该是它的父级。请注意,在TDBRichEditExt的方法中,ParentSelf.Parent是相同的。 如果您希望TLabel的父级成为TDBRichEditExt本身 - 您 - 那么您应该设置lblCaption.Parent := self; }。

现在,如果TLabel的父级是TDBRichEditExt的父级,则Top的{​​{1}}属性引用TLabel的父级},而不是TDBRichEditExt本身。因此,如果TDBRichEditExt的父级是TDBRichEditExt,那么TForm意味着Top := -5将位于上方上方表单的上方边缘。你的意思是

TLabel

但-5是一个太小的数字。你真正应该使用的是

lblCaption.Top := Self.Top - 5;

另外在标签和Rich Edit之间留出5个像素的空间。

另外,你想要

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

另一个问题

但这不起作用,因为在创建组件时,我认为尚未设置Parent。因此,您需要的是在更合适的时间进行标签的定位。此外,每次移动组件时都会移动标签,这非常重要!

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;