【问题标题】:TListview FMX onclick event along with Toggle DesignTListview FMX onclick 事件以及切换设计
【发布时间】:2017-12-07 13:02:31
【问题描述】:

实现如下:

ds.first;
  while not(ds.Eof) do
    begin
      L := LV1.Items.Add;
      L.Data['Part_No']   := ds.FieldByName('Part_no').AsString;
      L.Data['Part_Name'] := ds.FieldByName('Part_name').AsString;
      L.Data['LocNo']     := ds.FieldByName('Loc_No').AsString;
      L.Data['Qty']       := ds.FieldByName('BAL').AsFloat;
      ds.Next;
    end;

我使用代码动态添加项目

如何触发 OnItemClick 事件以检测单击了哪个元素。发现只是简单的事情非常令人沮丧。

任何帮助表示赞赏。

【问题讨论】:

  • AItem 是被点击的项目对象。或者你到底想要什么?也许我只是误解了..

标签: listview delphi firemonkey


【解决方案1】:

有点拼凑,但它应该让你开始:

function GetClickedDrawable(const AItem: TListViewItem; APoint: TPointF): TListItemDrawable;
var
  I: Integer;
begin
  Result := nil;
  // Fudge for statusbar height if using iOS. Should be done properly
  APoint := PointF(APoint.X, APoint.Y - 20); 
  for I := 0 to AItem.Objects.ViewList.Count - 1 do
  begin
    if AItem.Objects.ViewList[I].InLocalRect(APoint) then
    begin
      Result := AItem.Objects.ViewList[I];
      Break;
    end;
  end;
end;

procedure TForm1.ListViewItemClick(const Sender: TObject; const AItem: TListViewItem);
var
  LDrawable: TListItemDrawable;
begin
  LDrawable := GetClickedDrawable(AItem, ListView.AbsoluteToLocal(Screen.MousePos));
  if LDrawable <> nil then
    ShowMessage(LDrawable.Name);
end;

您需要调整 GetClickedDrawable 以适应您所使用的任何平台。 PS:谢谢提问;最终,我将需要做类似这样的事情:-)

编辑:

我保留了我原来的答案,以防以下在早期版本的 Delphi 中不可用:

使用 OnItemClickEx 事件。事件的参数使其非常不言自明

不知道为什么我之前没看到 :-)

【讨论】:

    【解决方案2】:

    “如何检测哪个元素已被点击或选择?发现只是简单的事情非常令人沮丧。”

    1.- 选择结构,例如:TlistView1/ItemAppearance/Item

    2.- 在 object Inspector 中,将 Appearance 更改为 DynamicAppearance。

    3.- 在对象检查器中,添加一个新的 TTextObjectAppearance,将名称更改为“MUV_HELY”之类的。

    4.- 添加项目

    ListView1.Items.Add.Objects.FindObjectT<TListItemText>('MUV_HELY').Text:= //Your record value, or something. /*string all the time*/
    

    /// 带图片 ///

    > ListView1.Items.Add.Objects.FindObjectT<TListItemImage>('IMAGE01').Bitmap := FMX.Graphics.TBitmap.CreateFromFile('.\Jelleg\List\'+Format('%.4d',[AdatSor.GYARTASISZAM])+'.bmp');
    

    '.\' -> 表示您的应用程序发布文件夹。你的 *.exe 在哪里。 'Format('%.4d',[AdatSor.GYARTASISZAM])' -> 表示对于这些示例,在我的数据库中存储的文件名中,我必须从文件中调用什么。我的数据库值为 1 和 2,但在文件名中我需要调用 0001.bmp 和 0002.bmp。

    5.-回读项目

    procedure TMainMenu.ListView1Change(Sender: TObject);
    begin
      if ListView1.Selected<>nil then ShowMessage(TAppearanceListViewItem(ListView1.Selected).Objects.FindObjectT<TListItemText>('MUV_HELY').Text);
    end;
    

    如果您使用键盘(上、下、左、右)更改所选项目,那么您将返回所选值,而无需单击它。

    【讨论】:

      猜你喜欢
      • 2016-09-11
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多