我有这个应用程序在许多地方重用了一种习语。有一个TPanel,上面有一些标签和按钮。目的是允许用户选择日期范围。
“& Dates”标题是一个标签,“All Dates”部分是第二个标签。当用户单击“选择”按钮时,弹出一个表单,向用户显示一对日期/时间控件和确定/取消按钮。如果用户在选择某些日期后点击确定,则第二个标签将更改为“从mm / dd / yyyy到mm / dd / yyyy”。
创建打包这些控件的组件是否合理?我一直在寻找组件编写者的各种资源,他们似乎没有指出我正在考虑的问题,例如处理按钮的onclick事件。如果这是一个合理的尝试,我也很感激指向如何制作这样一个“复合控制”的描述。
答案 0 :(得分:4)
这是合理的,是的。
要创建这样的组件,只需从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。
但是,除此之外,我认为上面的例子至少应该让你前进。 :)
答案 1 :(得分:4)
是的,绝对建立这样的组件是明智的,因为它节省了大量的编码。
以下是半视觉创建它们的指南:How to Build Aggregate/Composite Components in Delphi
基本上,本文档中概述的过程是:
我觉得错误的文档是,例如,示例组件是TPanel的后代,而对我来说,使用TCustomPanel更有意义,只暴露你想要的方法。
但它也解释了如何添加OnClick处理程序等。
这种方法的优点是可以直观地完成Panel中组件的布局。
答案 2 :(得分:2)
开发复合控件的一种非常实用的方法是使用TFrame作为基础。
这样,您可以直观地设计控件,并使用事件或继承
有一些事情你需要观察,但总而言之,它比手动编码所有内容要容易得多(就像其他一些答案所示)。
值得关注的事项(不完整列表,但关闭):
作为奖励,您不必从TPanel中删除斜角/边框和标题。
答案 3 :(得分:2)
另一种方法是使组件组成为component template。