德尔福:如何展示复合组件?

时间:2011-04-20 15:13:12

标签: delphi

我有一个复选框控件,带有标记的编辑作为已发布的子组件。

我要做的是为复选框创建一个Translate过程,该过程将在顶部显示标记的编辑,并允许用户更改复选框标题的文本。像这样:

constructor TPBxCheckBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FTranslateEdit := TLabeledEdit.Create(Self);
  FTranslateEdit.Parent := Self.Parent;
  FTranslateEdit.SetSubComponent(True);
  FTranslateEdit.Visible := False;
end;    

procedure TPBxCheckBox.Translate(Show: Boolean);
begin
  TranslateEdit.Left := Self.Left;
  TranslateEdit.Top := Self.Top;
  TranslateEdit.EditLabel.Caption := Self.Caption;
  TranslateEdit.Text := Self.Caption;
  TranslateEdit.Visible := Show;
  TranslateEdit.Width := Self.Width;
end;

但这不起作用 - 标签编辑永远不会显示。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:8)

它没有显示,因为尚未分配TPBxCheckBox.Create()时间Parent,所以您基本上正在执行TranslateEdit.Parent := nil;

如果您确实希望TranslatedEdit与TPBxCheckBox本身具有相同的父级,则可以覆盖SetParet并在TPBxCheckBox的Parent分配时执行操作。像这样:

TPBxCheckBox = class(TWhatever)
protected
  procedure SetParent(AParent: TWinControl); override;
end;

procedure TPBxCheckBox.SetParent(AParent: TWinControl);
begin
  inherited;
  TranslatedEdit.Parent := AParent;
end;

答案 1 :(得分:0)

当我使用多个部件制作组件时,我没有使用过SetSubComponent方法。

我所做的就是这样的事情

constructor TPBxCheckBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FTranslateEdit := TLabeledEdit.Create(Self);
  FTranslateEdit.Parent := Self;
  FTranslateEdit.Visible := False;
end;    

我会尝试这样的事情

procedure TPBxCheckBox.Translate(Show: Boolean);
begin
  FTranslateEdit.EditLabel.Caption := Self.Caption;
  FTranslateEdit.Left := Self.Left;
  FTranslateEdit.Top := Self.Top;
  FTranslateEdit.Width := Self.Width;
  FTranslateEdit.Height := Self.Height;
  FTranslateEdit.Text := Self.Caption;
  FTranslateEdit.Visible := Show;
end;

如果您向我提供更多信息或者我有时间对其进行测试,我会改进这个答案。