TForm.ListView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
li: TListItem;
lv : TListView;
begin
lv := TListView(Sender);
li := lv.GetItemAt(X, Y); // we get our ListItem
end;
但是使用Firemonkey ListView我没有看到任何GetItemAt函数。
那么请问我们如何使用ListView的OnMouseDown事件(在firemonkey中)获取ListItem。
非常感谢。答案 0 :(得分:1)
没有现成的解决方案来使用OnMouseDown查找项目。我建议你改用OnItemClick:
procedure TForm1.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem);
,它为您提供项目
的参考答案 1 :(得分:0)
正如汤姆所说,没有现成的解决方案。但是,如果您可以使用FMX源更改,则可以将其插入FMX.ListView
function TListViewBase.GetItemAt(P: TPointF):TListItem;
var
ItemAt: Integer;
begin
ItemAt := FindItemAbsoluteAt(Round(FScrollViewPos + P.Y - (LocalRect.Top + FSideSpace)));
if (ItemAt >= 0) and (ItemAt < Adapter.Count) then
Result := Adapter[ItemAt]
else
Result := nil
end;
答案 2 :(得分:0)
通过搜索鼠标的当前位置是否在项目矩形内,我发现TListViewItem在rigth上单击。
我只使用Y,因为我的所有主题只是文本,但你也可以通过使用X值来扩展复杂性。
在此示例中,我使用右键单击设置所选项目。
procedure TForm2.lwPlayListMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Single);
var
I: Integer;
rct: TRectF;
begin
if ssRight in Shift then
for I := 0 to lwPlayList.Items.Count-1 do
Begin
rct := lwPlayList.GetItemRect(I);
if ( rct.Bottom >= Y) and (Y >= rct.Top ) then
Begin
lwPlayList.ItemIndex := I;
lwPlayList.Selected := lwPlayList.Items[I];
End;
End;
end;
答案 3 :(得分:0)
通常,ListView.ItemIndex属性是正确的,因此您可以依靠它。但是您可以编写OnItemClick事件,以简单地在字段中获取AItem.Index,然后在双击事件中使用它。
procedure TForm1.ListView1ItemClick(const Sender: TObject;
const AItem: TListViewItem);
begin
FClickedIndex := AItem.Index;
end;
procedure TForm1.ListView1DblClick(Sender: TObject);
var
Index: Integer;
SelectedItemText: string;
begin
// it is correct as well
//Index := ListView1.ItemIndex;
Index := FClickedIndex;
SelectedItemText := ListView1.Items[Index].Objects.TextObject.Text;
// do something with the index, item or text.
end;