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

cro*_*don 4 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;
Run Code Online (Sandbox Code Playgroud)

但这不起作用 - 标签编辑从未显示过.

我在这做错了什么?

Cos*_*und 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;
Run Code Online (Sandbox Code Playgroud)

  • 似乎在德尔福地区是一个“德尔福-哈特”,无缘无故地被“随机”投了反对票。我不明白为什么没有诸如“您不能无缘无故地投下反对票”之类的规则。某些事情使您不得不在投下反对票之前写评论。+1以查看问题并提供正确答案Cosmin (2认同)