【发布时间】:2017-01-18 09:20:28
【问题描述】:
以 DRY 原则为主导,这是 Delphi 中以一个动作显示两个子窗体的最佳方式。 我的父表单有两个用于两个子表单的按钮。我有 TActionList,其中 TAction 添加了 OnExecute 事件。这两个按钮让子表单使用一个操作打开它们的最佳方式是什么。
【问题讨论】:
标签: delphi
以 DRY 原则为主导,这是 Delphi 中以一个动作显示两个子窗体的最佳方式。 我的父表单有两个用于两个子表单的按钮。我有 TActionList,其中 TAction 添加了 OnExecute 事件。这两个按钮让子表单使用一个操作打开它们的最佳方式是什么。
【问题讨论】:
标签: delphi
我将使用共享相同OnExecute 事件处理程序的两个操作。使用该事件处理程序的Sender 参数进行区分:
procedure TMainForm.acShowFormExecute(Sender: TAction);
begin
if Sender=acShowForm1 then
Form1.Show
else if Sender=acShowForm2 then
Form2.Show
else
raise ESomeInternalExceptionClass.Create('Unexpected action');
end;
您需要使用两个操作,因为例如,您的两个按钮会有不同的标题。
对于这个特定的示例,共享OnExecute 事件处理程序是否值得有些争议。如果您有不同的事件处理程序,如下所示:
procedure TMainForm.acShowForm1Execute(Sender: TAction);
begin
Form1.Show;
end;
procedure TMainForm.acShowForm2Execute(Sender: TAction);
begin
Form2.Show;
end;
再一次,如果您需要在事件处理程序中做额外的工作,余额会以另一种方式返回:
procedure TMainForm.acShowFormExecute(Sender: TAction);
var
FormClass: TMyChildFormClass;
Form: TTMyChildForm;
begin
if Sender=acShowForm1 then
FormClass := TForm1
else if Sender=acShowForm2 then
FormClass := TForm2
else
raise ESomeInternalExceptionClass.Create('Unexpected action');
Form := FormClass.Create(GetParam1, GetParam2);
try
Form.ShowModal;
finally
Form.Free;
end;
end;
几乎只要事件处理程序的主体包含多个内衬,那么我会说值得分享代码。
【讨论】: