gpt4 book ai didi

Delphi - 创建自定义 TToolBar 组件

转载 作者:行者123 更新时间:2023-12-03 15:51:06 33 4
gpt4 key购买 nike

我想创建一个自定义工具栏控件(后代 TToolBar),它应该有一些默认工具栏按钮。

所以我创建了一个简单的构造函数,它创建了 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;

问题是,在窗体上拖动自定义控件后,工具栏按钮可见,但它没有作为工具栏的一部分显示在对象检查器中。

如果尝试通过工具栏的按钮属性分配按钮,但这不起作用。也许有人有建议如何做到这一点?谢谢!

最佳答案

如果您将工具栏设置为工具按钮的所有者,则需要有一个已发布的属性才能在对象检查器中设置其属性。这也使得以后可以释放它。代码示例中的局部变量表明情况并非如此。

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);

关于Delphi - 创建自定义 TToolBar 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5221057/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com