Пользовательский элемент управления Delphi: TRichEdit с надписью TLabel над ним - PullRequest
2 голосов
/ 15 июня 2010

Я хочу создать пользовательский элемент управления (потомок TRichEdit). Я просто хочу добавить текст над полем редактирования.

Я создал свой собственный элемент управления и переопределил конструктор, чтобы создать подпись TLabel. Это работает, но моя проблема: как можно переместить ярлык над ричедитом? Когда я устанавливаю 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;

Чтобы сделать форму, которой принадлежит родитель, - но это не сработает ...

Как я мог этого достичь? Спасибо всем!

1 Ответ

9 голосов
/ 15 июня 2010

Я думаю, что это логично, что лейбл разочаровывает, так как богатство является Родитель

Это неправильно. В вашем коде родительский элемент 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...