创建复合控件是否明智?

wad*_*des 3 delphi components

我有这个应用程序,该应用程序在许多地方都可以重用一种习惯用法。有一个TPanel,上面有一些标签和按钮。目的是允许用户选择日期范围。

这是在运行时一个这样的面板的示例

“&Dates”标题是一个标签,“ All Dates”部分是第二个标签。当用户单击“选择”按钮时,将弹出一个表单,为用户提供一对日期/时间控件和“确定/取消”按钮。如果用户在选择某些日期后单击“确定”,则第二个标签将更改为“从mm / dd / yyyy到mm / dd / yyyy”。

创建一个打包这些控件的组件是否合理?我一直在寻找面向组件编写者的各种资源,他们似乎并没有指出我正在考虑的问题,例如处理按钮的onclick事件。如果尝试这样做是合理的,我也将感谢您提供有关如何进行这种“复合控件”的描述的指针。

bja*_*d_e 5

是的,是的。

要创建这样的组件,只需从例如TCustomPanel派生一个新类,然后将子组件添加为类中的字段。

像这样:

TMyDatePicker = class(TCustomPanel)
protected
  FChooseButton: TButton;
  FClearButton: TButton;
public
  constructor Create(Owner: TComponent); override; 
end;

constructor TMyDatePicker.Create(Owner: TComponent)
begin
  // Inherited
  Inherited;

  // Create Choose Button
  FChooseButton := TButton.Create(Self);
  FChooseButton.Parent := Self;
  FChooseButton.Align := alRight;
  FChooseButton.Caption := 'Choose';

  // Create Clear Button
  FClearButton := TButton.Create(Self);
  FClearButton.Parent := Self;
  FClearButton.Align := alRight;
  FClearButton.Caption := 'Clear';
end;
Run Code Online (Sandbox Code Playgroud)

要添加事件处理程序,只需将新的受保护过程添加到您的类中。

例如:

procedure TMyDatePicker.HandleChooseButtonClick(Sender: TObject)
begin
  // Do whatever you want to do when the choose button is clicked
end;
Run Code Online (Sandbox Code Playgroud)

然后将事件处理程序连接到选择按钮的OnClick事件(这应该在该类的Create方法中完成):

FChooseButton.OnClick := HandleChooseButtonClick;
Run Code Online (Sandbox Code Playgroud)

当然,还有其他功能,例如微调按钮的对齐方式和添加图标。另外,您还需要创建自己的事件,例如OnDateSelected或OnDateModified。

但是,除此之外,我认为上面的示例至少可以帮助您前进。:)


Rob*_*obS 5

是的,构建这样的组件绝对是明智的,因为它节省了大量的编码。

以下是半可视化创建它们的指南:How to Build Aggregate/Composite Components in Delphi

本质上,本文档中概述的流程是:

  1. 在 Delphi 中的表单内设计组件的布局,将所有组件放置在 TPanel(或其后代)内。
  2. 选择并复制面板并将其粘贴到文本文件中。
  3. 将所有“ = ”实例替换为“ := ”,并在每行末尾添加一个分号。
  4. 将所有 DFM“对象”声明行转换为适当的对象构造函数代码,将所有可视控件的父级设置为容器面板。
  5. 清理所有剩余的代码。位图需要放置在资源文件中。
  6. 将此新的 pascal 代码放入组件的创建构造函数中。在构造函数中,将对象部分分组到适当的子组件创建器下。

我认为文档错误的地方是,例如,示例组件是从 TPanel 派生的,而对我来说,使用 TCustomPanel 并仅公开您想要的方法更有意义。

但它也解释了如何添加 OnClick 处理程序等。

这种方法的优点是您可以直观地完成面板内组件的布局。

  • 请注意,GExperts 有一个“组件到代码”向导,可以帮助您进行 = -> := 替换。 (2认同)