一般来说
是的,OnUpdate
事件处理程序需要时间,就像任何其他例程一样。多个处理程序需要多倍的时间。所有这些代码的总和将评估导致无事可做的条件。从这个意义上说,您可以得出结论,这种更新机制会降低性能。特别是考虑到这些更新事件经常发生:
在应用程序空闲或操作列表更新时发生。
这可能是不使用它的原因。但是您应该意识到,单个表达式的评估通常不会花费太多时间。此外,请意识到无论动作更新如何,您的应用程序都会在每次鼠标移动时执行(更繁重的)计算和操作。
当您将更新事件中的代码持续时间保持在最低限度时,例如不通过数据库连接检查密码,那么性能将显得正常。如果您有与更新操作相关的冗长操作,请在这些特定情况下使用手动更新。
OnUpdate
请注意,不使用Actions 的单个事件,而是OnUpdate
使用具有取消进一步处理的参数的 ActionList 的事件,可以稍微提高性能Handled
,并具有集中化和分类的额外好处。
具体来说
您ListView1.SelCount
将 WinAPI 消息发送到控件以检索选择计数。这是一个很小的操作,我不会打扰它所需的时间。
另一种方法是更新 ListViewOnSelectItem
事件中的操作。该事件将捕获由于鼠标和键盘交互而导致的所有选择更改,以及设置单个项目的
Selected
属性:
procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
actTest.Enabled := ListView1.SelCount > 0;
end;
但是,ListView 和 VCL 不提供任何仅在SelCount = 0
和之间发出信号的东西SelCount > 0
,因此无论如何您将评估那行代码,而不是严格必要的。
假设MultiSelect
是真的,您还可以自己计算选择更改以消除调用的需要SelCount
:
private
FListViewSelected: Longbool;
procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
if Selected then
Inc(FListViewSelected)
else
Dec(FListViewSelected);
actTest.Enabled := FListViewSelected;
end;
或测试所选项目是否为零:
procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
actTest.Enabled := ListView1.Selected <> nil;
end;
但是话又说回来,真的没有理由不使用该OnUpdate
事件:
procedure TForm1.ActionList1Update(Action: TBasicAction; var Handled: Boolean);
begin
actTest.Enabled := ListView1.Selected <> nil;
Handled := True;
end;