gpt4 book ai didi

delphi - Delphi自定义控件: A TRichEdit with a TLabel Above It

转载 作者:行者123 更新时间:2023-12-03 03:00:47 29 4
gpt4 key购买 nike

我想创建一个自定义控件(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 的表单成为父表单 - 但这不起作用...

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

最佳答案

I think it's logic that the label disappaers since the richedit is the parent

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

现在,如果 TLabel 的父级是 TBRichEditExt 的父级,则 TLabel< 的 Top 属性 引用 TBRichEditExt 的父级,而不是 TBRichEditExt 本身。因此,如果 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;

另一个问题

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

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;

关于delphi - Delphi自定义控件: A TRichEdit with a TLabel Above It,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3046648/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com