gpt4 book ai didi

delphi - 自定义 GridPanel ControlItems 问题

转载 作者:行者123 更新时间:2023-12-03 15:54:04 25 4
gpt4 key购买 nike

我将 TGridPanel 子类化为我的控件 TMyGridPanel

我这样做是因为我想在 GridPanel 中添加 4 个默认按钮。

所以我重写构造函数并创建如下按钮:

constructor TMyGridPanel.Create(AOwner: TComponent);
var
i: Integer;
btn: TButton;
begin
inherited Create(AOwner);

for i := 0 to 3 do
begin
btn := TButton.Create(Self);
btn.Parent := Self;
btn.Align := alClient;
btn.Caption := 'Hello World';
btn.Visible := True;
end;
end;

这工作正常。ControlCollection Items 属性将 4 个按钮显示为 CollectionItems

现在我想复制并粘贴(重复)我的控件,因为我想要其中 2 个。但是,当我这样做时,按钮不会显示在控件中。

ControlCollection Items 属性显示 4 个 Collection Items,但它们没有名称(空)。当我关闭表单并重新打开它时,会出现按钮。

我已经尝试解决这个问题几天了,但无法解决。

最佳答案

问题:

当您将面板组件复制到剪贴板时,其所有已发布的属性都会传输到文本中(将其粘贴到记事本中以查看其外观)。

粘贴到表单会从此文本重建组件。

由于 ControlCollection 属性在 Vcl.ExtCtrls.TGridPanel 中定义为 published,因此其中的按钮包含在此文本中。以下是摘录:

object MyGridPanel1: TMyGridPanel
Left = 64
...
ControlCollection = <
item
Column = 0
Control = Button9
Row = 0
end
item
Column = 1
Control = Button10
Row = 0
end
...
object Button9: TButton
Left = 1
...
end
object Button10: TButton
Left = 92
...
end
...
end

粘贴时,IDE 设计者首先创建一个 TMyGridPanel 类的新对象。在此步骤中,TMyGridPanel 的构造函数创建一组新的按钮。

之后,所有已发布的属性都会从文本中重建,包括其中的 ControlCollection 和 Button,这就是问题所在。

可能的解决方案:

这种情况下可能的解决方案是将 TMyGridPanel 的父类更改为 TCustomGridPanel

TMyGridPanel2 = class(TCustomGridPanel)
...

TCustomGridPanel(与其他 TCustom... 组件类似)不会发布其任何属性,因此它们不会流入剪贴板。

实际上,从控件的 TCustom... 变体继承,而不是从 Component Pallet 中注册的控件继承,是子类化组件的正确方法。

如果我们现在将 TMyGridPanel2 的这个变体复制到剪贴板并将其粘贴到记事本中,我们可以看到没有其他属性:

object MyGridPanel21: TMyGridPanel2
Left = 184
Top = 200
Width = 185
Height = 41
end

缺点:

这种方法有效,但有几个必须注意的缺点:

  • 您无法在对象检查器中访问由 TGridPanel 引入的自定义属性(但您可以在运行时访问它们)。将属性带回对象检查器的一种解决方法是将其添加到组件的 published 部分:

    TMyGridPanel2 = class(TCustomGridPanel)
    public
    ...
    published
    property BorderStyle;
    property ColumnCollection;
    property RowCollection;
    ...
    end;
  • 您无法通过对象检查器更改四个按钮的属性,也无法向它们附加事件。您必须在代码中执行此操作。

    其实这是很好的行为。当您创建具有子控件的复合组件时,最好将所有功能包含在组件本身中。

完整代码示例:

unit MyGridPanel2;

interface

uses
Classes, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Controls;

type
TMyGridPanel2 = class(TCustomGridPanel)
private
public
constructor Create(AOwner: TComponent); override;
published
end;

procedure Register;

implementation

{ TMyGridPanel2 }

constructor TMyGridPanel2.Create(AOwner: TComponent);
var
i: Integer;
btn: TButton;
begin
inherited Create(AOwner);

for i := 0 to 3 do
begin
btn := TButton.Create(Self);
btn.Parent := Self;
btn.Align := alClient;
btn.Caption := 'Hello World';
btn.Visible := True;
end;
end;

procedure Register;
begin
RegisterComponents('Custom', [TMyGridPanel2]);
end;

end.

首先在测试项目中尝试此操作,而不是在生产中。

关于delphi - 自定义 GridPanel ControlItems 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35742762/

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