我想创建一个自定义控件(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的表单成为父级 - 但这不起作用......
我怎么能实现这个目标? 谢谢大家!
答案 0 :(得分:9)
我认为这是标签的逻辑 自从这个时代以来,人们就失望了 父
这是错误的。在您的代码中,TLabel
的父级是TDBRichEditExt
的父级,应该是它的父级。请注意,在TDBRichEditExt
的方法中,Parent
和Self.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;