Firemonkey ListView OnMouseDown事件

时间:2014-12-02 13:57:20

标签: delphi firemonkey

在VCL中我们可以使用它(获取ListItem):

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。

非常感谢。

4 个答案:

答案 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;