Delphi- 如何在点击按钮时调用 ActionList?
Delphi- How to Call ActionList on button click?
我正在 Delphi XE8 中制作一个多设备应用程序,它使用 LiveBindings 到数据集。
FMX 有许多特定于 LB 的操作,包括 TFMXBindNavigateDelete。我正在尝试在这样的按钮单击处理程序中使用它:
按钮点击代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
if cdsOrdersSTATUS.Value='READY' then
begin
ShowMessage('Your Order Is Already READY/PENDING!');
end
else
begin
TAction(ActionList1.Actions[0]).Execute; //Not working,why?
end;
end;
ActionList1 的 Actions 中的第一个(也是唯一一个)项目是我的 FMXBindNavigateDelete1。
问题是,即使代码TAction(ActionList1.Actions[0]).Execute
执行了,当前数据集记录没有被删除,所以显然
TFMXBindNavigateDelete 的 Action 无效。为什么会这样,我怎样才能让它发挥作用?
图。动作列表 1:
我不明白你到底想做什么,但如果你通过它的索引触发动作,你可以这样做:
TAction(ActionList1.Actions[0]).Execute;
实际上,我认为这是一个很好的问题,不值得投反对票。
我可以重现你的问题。我在 FMX 表单上放了两个按钮。我设置
Button1 的 OnClick 到您的 Button1Click
和 Button2 的 Action
到 LiveBindingsBindNavigateDelete1
.
点击Button2弹出标准'Delete record?'确认并删除当前记录
如果我按预期回答 "Yes"。
但是,当单击 Button1 时,即使您的 else
块执行,'Delete record?' 确认
没有出现,所以该记录不可能被删除。
原因在代码中
function TCustomAction.Execute: Boolean;
begin
Result := False;
if Supported and not Suspended then
begin
Update;
if Enabled and AutoCheck then
if (not Checked) or (Checked and (GroupIndex = 0)) then
Checked := not Checked;
if Enabled then
Result := ((ActionList <> nil) and ActionList.ExecuteAction(Self)) or
((Application <> nil) and Application.ExecuteAction(Self)) or inherited Execute or
((Application <> nil) and Application.ActionExecuteTarget(Self));
end;
end;
Enabled
属性 似乎在调用期间默认设置为 False
Update
所以 if Enabled then ...
永远不会执行。我还没找到
一种在调用 Update
期间将 Enabled
设置为 True 的方法。也许其他人知道该怎么做。
在 Button2
的情况下,执行然后转到 TComponent.ExecuteAction
和
是其中对 Action.ExecuteTarget(Self)
的调用导致了
正在执行记录删除例程。
因此,在我看来,您的问题似乎变成了如何调整代码,以便
TComponent.ExecuteAction
被执行,换句话说,如何关联
Action
带有组件。答案很明显。
只要这个
procedure TForm1.Button1Click(Sender: TObject);
begin
if cdsOrdersSTATUS.Value='READY' then
begin
ShowMessage('Your Order Is Already READY/PENDING!');
end
else
begin
Button1.ExecuteAction(LiveBindingsBindNavigateDelete1); // <- this works
//LiveBindingsBindNavigateDelete1.Execute; //Not working,why?
end;
end;
我正在 Delphi XE8 中制作一个多设备应用程序,它使用 LiveBindings 到数据集。
FMX 有许多特定于 LB 的操作,包括 TFMXBindNavigateDelete。我正在尝试在这样的按钮单击处理程序中使用它:
按钮点击代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
if cdsOrdersSTATUS.Value='READY' then
begin
ShowMessage('Your Order Is Already READY/PENDING!');
end
else
begin
TAction(ActionList1.Actions[0]).Execute; //Not working,why?
end;
end;
ActionList1 的 Actions 中的第一个(也是唯一一个)项目是我的 FMXBindNavigateDelete1。
问题是,即使代码TAction(ActionList1.Actions[0]).Execute
执行了,当前数据集记录没有被删除,所以显然
TFMXBindNavigateDelete 的 Action 无效。为什么会这样,我怎样才能让它发挥作用?
图。动作列表 1:
我不明白你到底想做什么,但如果你通过它的索引触发动作,你可以这样做:
TAction(ActionList1.Actions[0]).Execute;
实际上,我认为这是一个很好的问题,不值得投反对票。
我可以重现你的问题。我在 FMX 表单上放了两个按钮。我设置
Button1 的 OnClick 到您的 Button1Click
和 Button2 的 Action
到 LiveBindingsBindNavigateDelete1
.
点击Button2弹出标准'Delete record?'确认并删除当前记录 如果我按预期回答 "Yes"。
但是,当单击 Button1 时,即使您的 else
块执行,'Delete record?' 确认
没有出现,所以该记录不可能被删除。
原因在代码中
function TCustomAction.Execute: Boolean;
begin
Result := False;
if Supported and not Suspended then
begin
Update;
if Enabled and AutoCheck then
if (not Checked) or (Checked and (GroupIndex = 0)) then
Checked := not Checked;
if Enabled then
Result := ((ActionList <> nil) and ActionList.ExecuteAction(Self)) or
((Application <> nil) and Application.ExecuteAction(Self)) or inherited Execute or
((Application <> nil) and Application.ActionExecuteTarget(Self));
end;
end;
Enabled
属性 似乎在调用期间默认设置为 False
Update
所以 if Enabled then ...
永远不会执行。我还没找到
一种在调用 Update
期间将 Enabled
设置为 True 的方法。也许其他人知道该怎么做。
在 Button2
的情况下,执行然后转到 TComponent.ExecuteAction
和
是其中对 Action.ExecuteTarget(Self)
的调用导致了
正在执行记录删除例程。
因此,在我看来,您的问题似乎变成了如何调整代码,以便
TComponent.ExecuteAction
被执行,换句话说,如何关联
Action
带有组件。答案很明显。
只要这个
procedure TForm1.Button1Click(Sender: TObject);
begin
if cdsOrdersSTATUS.Value='READY' then
begin
ShowMessage('Your Order Is Already READY/PENDING!');
end
else
begin
Button1.ExecuteAction(LiveBindingsBindNavigateDelete1); // <- this works
//LiveBindingsBindNavigateDelete1.Execute; //Not working,why?
end;
end;