FireMonkey 的 ListView 在设计期可以定制一个 Item 上有多个 TEXT,IMAGE 和 Button。
如何做,本博客前面有文章讲到。请见这里:FireMonkey ListView 绑定数据显示多个图片_pcplayer的博客-CSDN博客
那么,如果添加的是一个按钮,如何知道用户点了这个按钮?在设计期添加的按钮,其属性面板上,只有 Property 而没有 Event,没有 OnClick 可以选择。
看了半天 ListView 的源代码没找到办法。上网一搜,有了办法:
listview - Working with buttons in a TListView - Stack Overflow
我自己的测试代码
在设计期,给一个 Item 添加两个按钮。其默认的名字分别是:TextButton2 和 TextButton3。
在 ListView1 的属性面板上,切换到 Events 事件页,找到 OnButtonClick,双击,IDE 生成代码框架。代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
AItem: TListViewItem;
begin
AItem := ListView1.Items.Add;
end;
procedure TForm1.ListView1ButtonClick(const Sender: TObject;
const AItem: TListItem; const AObject: TListItemSimpleControl);
begin
//以下代码,测试成功。
ShowMessage(AObject.Name + ' _ ' + AItem.Index.ToString + ' - ' + (AObject as TListItemTextButton).Text);
end;
上面代码的第一个 Button1Click 是为了测试增加的一个按钮,按一次在 ListView1 里面增加一个 Item。
第二个方法,就是我们要的。实际测试结果,完全符合预期。
实际测试结果,点了哪一条 Item 上面的按钮,显示出来的 AItem.Index 是正确的。也能够正确显示出该按钮的名字(TextButton2 或者 TextButton3),也能够正确显示按钮上的 Text.
上面的代码,对 AObject 进行了类型转换,转换为 TListItemTextButton,否则无法获取到它的 Text 属性。类型转换能够成功,说明这个设计期动态增加的按钮的类型,就是 TListItemTextButton,而不是设计期的属性面板上显示的 TTextButtonObjectAppeaerance.
结论:
如果想知道用户点了哪个按钮,并相应给出动作,这里不是给该按钮找一个 OnClick 而是直接使用 ListView 的 OnButtonClick 事件。在事件里面判断用户点了哪个按钮。
|