-1

I'm trying to execute an action (TakePhotoFromCameraAction) in a TActionList, when a TListViewItem is selected.

TlistView 和 TListViewItem 都没有 Action 属性,所以我尝试在事件中调用 ActionList[0].Execute ,但没​​有任何反应。

有任何想法吗?

进一步:代码非常简单,因为它只是对这个问题的测试。我专注于 ActionList,因为那是我将使用的(当我整理出来时)。Button1 不工作(它总是失败,即使按钮 2 不工作),而(新)Button2 工作正常。

type
  TForm1 = class(TForm)
    ActionList1: TActionList;
    Memo1: TMemo;
    TakePhotoFromCameraAction1: TTakePhotoFromCameraAction;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
     ActionList1[0].Execute;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     if TakePhotoFromCameraAction1.Execute
     then
         Memo1.Lines.add('Photo OK')
     else
         Memo1.Lines.add('Photo Fail');
end;
4

2 回答 2

1

您可以使用tagTListViewItem 的良好旧属性来存储指向要与此项目一起使用的 TAction 的指针。当然,您不能在对象检查器中设置它,但可以在 TForm.onCreate 事件或其他方便的地方以编程方式进行。它的类型 NativeInt 与指针大小相同,无论是 32 位还是 64 位架构,因此它应该可以正常工作。

像这样的东西:

//in formCreate or other place to initialize actions:
TakePhotoItem.Tag:=NativeInt(TakePhotoFromCameraAction);
SavePhotoItem.Tag:=NativeInt(SavePhotoAction);
//...

//onitemchange event handler
if AItem.Tag<>0 then
  TAction(AItem.Tag).Execute;

也许最好介绍您自己的具有 Action 属性的 TListViewItem 的后代,这样您就必须仅在代码中填充您的列表视图,而不是添加基本的 TListViewItem,而是添加 TActionListViewItem(您的类的名称),这还有更多工作要做,但是将产生更易于理解的代码。

于 2016-01-12T00:48:38.860 回答
0

ActionList1[0].Execute;调用与.没有区别(除了丑陋)Action1.Execute;

您没有显示.fmx文件,所以我不知道您可能在组件之间设置了什么链接,但是,您似乎没有为操作 OnExecute 事件分配任何内容,因此没有得到预期的响应Execute称呼。

文档的 FMX 版本不是很清楚,但 VCL 版本(IMO)更好(在简短的测试中,我没有看到实际功能有任何差异):来自文档

当客户端控件“触发”时响应。

当客户端控件“触发”时(例如,当用户单击按钮或选择菜单项时),将自动调用 Execute。如果找到事件处理程序来处理该操作,则返回 True,如果没有事件处理程序或未启用该操作,则返回 False。

但是您当然也可以Execute在尝试时直接调用。并进一步

Execute first 确保更新操作。然后,如果 Enabled 属性为 True,它会尝试通过在包含此操作的操作列表上生成 OnExecute 事件来处理该操作(如果该操作属于操作列表)。如果操作列表的 OnExecute 事件处理程序不处理该操作,则 Execute 会在应用程序本身上生成一个 OnActionExecute 事件。如果操作列表和应用程序都没有处理响应这些事件的操作,则 Execute 会在其自身上生成一个 OnExecute 事件。如果此操作没有 OnExecute 事件处理程序,则 Execute 指示应用程序定位当前目标控件并调用 ExecuteTarget 方法,这是预定义的操作类执行其功能的机制。

请注意,您可以TActionList.OnExecuteTAction.OnExecute

于 2016-01-14T15:00:39.897 回答