【问题标题】:Detect where ListViewItem has been clicked/pressed检测 ListViewItem 被点击/按下的位置
【发布时间】:2016-12-30 04:41:59
【问题描述】:

在 Delphi XE8 中使用 Firemonkey TListView。

我有一个包含大约 5 个项目的 ListView。每个项目中都有一个图像。

如何检测图像何时被点击/按下?

我一直在看程序:

OnItemClickEx

但我不明白如何使用它。不确定这是否是我需要使用的。

任何帮助都会很棒。

谢谢,

【问题讨论】:

    标签: android delphi firemonkey delphi-xe8


    【解决方案1】:

    设置 Listview 项目图像对象属性....

    procedure TForm1.OnFormCreate(Sender:TObject)
    begin
      ListView1.ItemAppearanceObjects.ItemObjects.Image.Align :=  TListItemAlign.Leading;
      ListView1.ItemAppearanceObjects.ItemObjects.Image.VertAlign := TListItemAlign.Center;
      ListView1.ItemAppearanceObjects.ItemObjects.Image.PlaceOffset.X := 370;
    end;
    

    然后在 ItemClickEx 过程中我做了以下操作:

    procedure TForm1.ListView1ItemClickEx(const Sender: TObject;
    ItemIndex: Integer; const LocalClickPos: TPointF;
    const ItemObject: TListItemObject);
    begin
     if (LocalClickPos.X > ListView1.ItemAppearanceObjects.ItemObjects.Image.PlaceOffset.X) and
          (LocalClickPos.X < (ListView1.ItemAppearanceObjects.ItemObjects.Image.PlaceOffset.X + ListView1.ItemAppearanceObjects.ItemObjects.Image.Width)) and
          (LocalClickPos.Y > ListView1.ItemAppearanceObjects.ItemObjects.Image.PlaceOffset.Y) and
          (LocalClickPos.Y < (ListView1.ItemAppearanceObjects.ItemObjects.Image.PlaceOffset.Y + ListView1.ItemAppearanceObjects.ItemObjects.Image.Height)) then
      begin
        ShowMessage('Image Pressed!');      
      end;
    end;
    

    【讨论】:

      【解决方案2】:

      在 ListView1ItemClickEx 事件上添加

       if ItemObject is TListItemImage then
          ShowMessage('Image Pressed!)
      

      【讨论】:

        【解决方案3】:

        您已经在寻找正确的程序。你必须在那里检查参数ItemObject的类:

        if (ItemObject<>nil) and (ItemObject.InheritsFrom(TListItemImage)) then
            //...
        

        这是与 RAD Studio 10.1 Berlin 配合使用的最小示例:

        创建一个新的多设备应用程序并在主窗体上放置一个TlistView。 添加以下事件处理程序:

        procedure TForm1.FormCreate(Sender: TObject);
        begin
          ListView1.ItemAppearance.ItemAppearance := 'ImageListItemBottomDetail';
          ListView1.Items.Add;
        end;
        
        procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex:  Integer;
          const LocalClickPos: TPointF; const ItemObject: TListItemDrawable);
        begin
          if (ItemObject<>nil) and (ItemObject.InheritsFrom(TListItemImage)) then
            ShowMessage('image clicked');
        end;
        

        【讨论】:

        • 感谢您的评论,我刚刚尝试过,但仍然没有得到任何回复。在“then”之后,我在 ShowMessage 对话框中输入了一条测试消息,但没有出现。我在 windows 和 android 上测试了这个。
        • 您是否将属性ItemAppearance 设置为'ImageListItem' 或类似的东西?
        • 设置为 'ImageListItemBottomDetail'
        • 我认为这是一个 XE8 问题/错误。我已经创建了一个新的测试应用程序并完成了您的建议,单击图像时我仍然没有得到响应。老实说有点痛苦!
        • 也许可以用 LocalClickPos 参数做点什么?
        【解决方案4】:
        procedure TfmReference.ListView1UpdateObjects(const Sender: TObject;
         const AItem: TListViewItem);
        begin
         AItem.Objects.FindObjectT<TListItemImage>('Image4').Bitmap := ImageList1.Source.Items[0].MultiResBitmap[0].Bitmap;
        end;
        

        【讨论】:

          【解决方案5】:
          procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex:  Integer;
            const LocalClickPos: TPointF; const ItemObject: TListItemDrawable);
          begin
          ShowMessage('clicked: ' + ItemObject.Name); 
          // ItemObject.Name is the name of the oject that is clicked in the ListView row.
          
          //If just looking for type of object:
          if ItemObject is TListItemAccessory then ShowMessage('Acessory clicked');
          
          if ItemObject is TListItemImage then ShowMessage('Image clicked: ' + ItemObject.Name);
          
          if ItemObject is TListItemText then ShowMessage('text clicked');
          end;
          

          【讨论】:

            【解决方案6】:
            procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex: Integer;
               const LocalClickPos: TPointF; const ItemObject: TListItemDrawable);
            begin
            if TListView(sender).Selected <> nil then
            begin
                if ItemObject is TListItemImage then
                begin
                  if TListItemImage(ItemObject).Name = 'Image3' then
                    begin
                      TabControl1.ActiveTab := TabItem2;
                    end;
                 end;
             end;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-02-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多