如何从TListViewItem执行ActionList项

时间:2016-01-11 23:45:26

标签: delphi firemonkey tlistview tactionlist

当我选择TListViewItem时,我试图在TActionList中执行一个动作(TakePhotoFromCameraAction)。

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;

2 个答案:

答案 0 :(得分:1)

您可以使用TListViewItem的良好旧tag属性来存储要与此项目一起使用的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后代,这样你就不得不在代码中填充listview,不是添加基本的TListViewItem,而是添加TActionListViewItem(你的类的名字) ),还有更多的工作要做,但会产生更易理解的代码。

答案 1 :(得分:0)

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

您没有显示.fmx文件,因此我无法知道您可能在组件之间设置了什么链接,但是,似乎您没有为操作OnExecute事件分配任何内容,因此无法获得Execute来电的预期回复。

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

  

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

     

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

但您可以直接在尝试时调用Execute。进一步

  

首先执行确保更新操作。然后,如果启用   property为True,它试图通过生成一个来处理动作   包含此操作的操作列表上的OnExecute事件(如果是   动作属于动作列表)。如果动作列表的OnExecute   事件处理程序不处理该操作,Execute生成一个   应用程序本身的OnActionExecute事件。如果既不是动作   列表和应用程序处理响应这些操作的操作   事件,Execute自身生成一个OnExecute事件。如果这个动作   没有OnExecute事件处理程序,Execute指示应用程序   找到当前目标控件并调用ExecuteTarget方法,   这是预定义动作类执行的机制   他们的功能。

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

中的操作