我有一个复选框控件,带有标记的编辑作为已发布的子组件。
我要做的是为复选框创建一个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;
但这不起作用 - 标签编辑永远不会显示。
我在这里做错了什么?
答案 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;
如果您向我提供更多信息或者我有时间对其进行测试,我会改进这个答案。