我想创建一个自定义工具栏控件(后代TToolBar),它应该有一些default-toolbarButtons。
所以我创建了一个简单的构造函数,它创建了1个默认按钮:
constructor ZMyToolbart.Create(AOwner: TComponent);
var
ToolButton : TToolButton;
begin
inherited;
Parent := Owner as TWinControl;
ToolButton := TToolButton.Create(Self);
ToolButton.Parent := Self;
ToolButton.Caption := 'Hallo';
end;
问题是,在窗体上拖放自定义控件后,工具栏按钮是可见的,但它不会在对象检查器中显示为工具栏的一部分。
如果尝试通过工具栏的按钮属性分配按钮,但这不起作用。 也许有人建议如何做到这一点?谢谢!
答案 0 :(得分:4)
如果将工具栏设为工具按钮的所有者,则需要具有已发布的属性才能在对象检查器中设置其属性。这也可以在以后释放它。代码示例中的局部变量表明情况并非如此。
type
ZMyToolbart = class(TToolbar)
private
FHalloButton: TToolButton;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property HalloButton: TToolButton read FHalloButton write FHalloButton;
end;
constructor ZMyToolbart.Create(AOwner: TComponent);
begin
inherited;
Parent := Owner as TWinControl;
FHalloButton := TToolButton.Create(Self);
FHalloButton.Parent := Self;
FHalloButton.Caption := 'Hallo';
end;
destructor ZMyToolbart.Destroy;
begin
FHalloButton.Free;
inherited;
end;
这可能不会给你你想要的东西,你会在OI的子属性中看到按钮的属性,而不是像其他按钮一样。如果您希望按钮显示为普通工具按钮,请将其所有者设为表单,而不是工具栏。
然后按钮可以自行选择。这也意味着按钮可能会在设计时(以及运行时)被删除,因此您希望在删除按钮时将其通知并将其引用设置为nil。
最后,您只想在设计时创建按钮,因为在运行时按钮将从.dfm流式创建,然后您将有两个按钮。
不要忘记注册按钮类:
type
ZMyToolbart = class(TToolbar)
private
FHalloButton: TToolButton;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
end;
[...]
constructor ZMyToolbart.Create(AOwner: TComponent);
begin
inherited;
Parent := Owner as TWinControl;
if Assigned(FHalloButton) then
Exit;
if csDesigning in ComponentState then begin
FHalloButton := TToolButton.Create(Parent);
FHalloButton.Parent := Self;
FHalloButton.FreeNotification(Self);
FHalloButton.Caption := 'Hallo';
end;
end;
destructor ZMyToolbart.Destroy;
begin
FHalloButton.Free;
inherited;
end;
procedure ZMyToolbart.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (AComponent = FHalloButton) and (Operation = opRemove) then
FHalloButton := nil;
end;
initialization
RegisterClass(TToolButton);
答案 1 :(得分:1)
似乎ToolButton的所有者应该是表单本身而不是工具栏。 将代码更改为以下内容时,ToolButton将显示在对象检查器的工具栏中:
constructor ZMyToolbart.Create(AOwner: TComponent);
var
ToolButton : TToolButton;
begin
inherited;
Parent := Owner as TWinControl;
ToolButton := TToolButton.Create(Self.Parent);
ToolButton.Parent := Self;
ToolButton.Caption := 'Hallo';
end;