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 的 ActionLiveBindingsBindNavigateDelete1.

点击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;