MyLabel 的 TCustomLabel 标题没有改变

MyLabel's Caption of TCustomLabel is not changing

我创建了一个继承自 TCustomLabel 的组件 TMyLabel

如果布尔值 属性 SetPeriodAtEnd 设置为 True,我想在 Caption 末尾添加句点,如果设置为 False,我想删除句点。

我已经声明了布尔值 属性:

property SetPeriodAtEnd: Boolean read fPeriodAtEnd write SetPeriodAtEnd;
procedure TMyLabel.SetPeriodAtEnd(Value: Boolean);
begin
  fPeriodAtEnd := Value;
  if fPeriodAtEnd then
    Caption := Caption + '.......';
end;

这在 SetPeriodAtEnd() 仅更改一次时有效。后来 ...... 即使是 False 值也会被添加。

此外,我的动机是仅在 Caption 中添加句点 ...... 以供查看,而不是作为价值。例如,Caption := hello.... 用于查看和存储 Captionhello,没有句号。这可能吗?

仅 cDots 可以 select 不同的字体样式和颜色吗?

对于您尝试执行的操作,您可以重写虚拟 GetLabelText() 方法:

Returns the value of the Caption property.

Call GetLabelText to obtain the string that appears as the text of the label.

在内部,TCustomLabel 在绘制其 Caption 时使用 GetTextLabel(),并且在 Caption 更改且 AutoSize 为真时调整自身大小时。因此,您可以覆盖 GetLabelText() 以提供与 Caption 设置不同的字符串,例如:

type
  TMyLabel = class(TCustomLabel)
  private
    fPeriodAtEnd: Boolean;
    procedure SetPeriodAtEnd(Value: Boolean);
  protected
    function GetLabelText: string; override;
  published
    property SetPeriodAtEnd: Boolean read fPeriodAtEnd write SetPeriodAtEnd;
  end;

...

uses
  System.StrUtils;

function TMyLabel.GetLabelText: string;
const
  cDots = '.......';
begin
  Result := inherited GetLabelText;
  if fPeriodAtEnd then
  begin
    if not EndsText(cDots, Result) then
      Result := Result + cDots;
  end
  else begin
    if EndsText(cDots, Result) then
      Result := LeftStr(Result, Length(Result)-Length(cDots));
  end;
end;

procedure TMyLabel.SetPeriodAtEnd(Value: Boolean);
begin
  if fPeriodAtEnd <> Value then
  begin
    fPeriodAtEnd := Value;
    Perform(CM_TEXTCHANGED, 0, 0); // triggers Invalidate() and AdjustBounds()
  end;
end;