当我选择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;
答案 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.OnExecute
或TAction.OnExecute