3

我有这个应用程序在许多地方重用了一种成语。有一个 TPanel,上面有一些标签和按钮。目的是允许用户选择日期范围。

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

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

创建一个封装这些控件的组件是否合理?我一直在查看组件编写者的各种资源,但它们似乎没有指出我正在考虑的问题,例如处理按钮的 onclick 事件。如果这是一个合理的尝试,我也很感激关于如何制作这种“复合控件”的描述的指针。

4

4 回答 4

6

这是合理的,是的。

要创建这样的组件,只需从例如 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;

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

例如:

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

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

FChooseButton.OnClick := HandleChooseButtonClick;

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

但是,除此之外,我认为上面的例子至少应该让你继续前进。:)

于 2012-06-05T21:22:57.990 回答
5

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

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

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

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

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

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

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

于 2012-06-05T21:33:13.367 回答
2

开发复合控件的一种非常实用的方法是使用TFrame作为它的基础。

这样,您可以直观地设计控件,并使用事件或继承

您需要注意几件事,但总而言之,这比手动编码所有内容要容易得多(就像其他一些答案所暗示的那样)。

需要注意的事项(不是完整列表,但很接近):

  • 别忘了小枝
  • 在设计时(在 TFrame 中和将复合控件放在设计图面上时),标记为 Visible=True 的子控件仍然可见。解决此问题的两种方法:销毁这些控件,或将它们移动到不可见区域(顶部/左侧为负值或大于父级的宽度/高度的值)
  • 将 TFrame 后代注册为组件,其中 TFrame 后代也是项目的一部分,有时会使 IDE 感到困惑。简单的解决方案:调用 TFrame 后代“TMyCustomControl”,从中派生“TMyControl”,并将“TMyControl”注册为组件。

作为奖励,您不必从 TPanel 中删除斜角/边框和标题。

于 2012-06-06T07:58:38.163 回答
2

还有一种方法是使组件组成为组件模板

于 2012-06-06T12:12:01.617 回答