delphi - 如何搜索 FMX.TListView header 以及项目

标签 delphi firemonkey delphi-10.3-rio

我有一个 LiveBindings 数据绑定(bind) FMX.TListView,其中 FieldName 为 Stage,FillHeaderFieldName 为 Production。当应用程序运行时,我会看到使用 HeaderAppearance 的 Production 列表,并且在每个 Production 中,都有一个使用 ItemAppearance 的 Stage 列表。我已打开 SearchVisible 以使组件搜索面板显示在列表顶部。

enter image description here

目前,在搜索框中输入内容只会过滤舞台上的内容,而不会过滤制作中的内容。

enter image description here

我希望能够同时执行这两项操作,并且无需使用过滤器参数进行另一个 REST 调用即可完成此操作。我知道我可能需要为 OnSearchChange 事件编写一个事件处理程序,并且我有这段代码来输入搜索文本:

  List := Sender as TListView;

  for I := 0 to List.Controls.Count-1 do
    if List.Controls[I].ClassType = TSearchBox then
    begin
      SearchBox := TSearchBox(List.Controls[I]);
      break;
    end;

我认为我需要设置 Items.Filter 属性,并且我使用了这段代码:

  Lower := LowerCase(SearchBox.Text.Trim);

  List.Items.Filter :=
    function(X: string): Boolean
    begin
      Result:= (Lower = EmptyStr) or LowerCase(X).Contains(Lower);
    end;

问题之一是 ListView 组件在键入字符后立即应用其过滤,而 OnSearchChange 事件仅在搜索框失去焦点时触发。

第二个问题是,即使在触发事件并设置新的过滤器函数之后,列表也不会发生任何变化。

我已经确认“36”示例中的 List.Items 集合实际上包含所有 6 个项目 - 3 个 header 项目和 3 个详细信息项目 - 所以我不确定为什么过滤器不适用于标题项目,因为它适用于详细信息项目。

最佳答案

我尝试了一下并找到了解决方案。请记住,我无法访问 Delphi 10.3 Rio。我使用的是 10.1 柏林。另请记住,我通常所做的是在代码中绑定(bind),而不是在视觉上绑定(bind)。但为此我坚持使用视觉绑定(bind)。

作为数据集,我使用了 TFDMemoryTable (mt1),其中包含 2 个数据字段(fmt1Prod 和 fmt1Stage)和 1 个计算字段 (fmt1Search)。我有以下处理程序来计算搜索字段:

Procedure TForm2.mt1CalcFields(DataSet: TDataSet);
Begin
  fmt1Search.AsString := fmt1Prod.AsString + '|' + fmt1Stage.AsString;
End;

我在OnFormCreate内存表中放入了一些随机数据:

Procedure TForm2.FormCreate(Sender: TObject);
Var
  i1, i2: Integer;
  s1, s2: String;
Begin
  mt1.CreateDataSet;
  For i1   := 1 To 13 Do Begin
    s1     := 'Prod' + FormatFloat('00', i1);
    For i2 := Random(6) To Random(14) Do Begin
      s2   := 'Stage' + FormatFloat('00', i2);
      mt1.Append;
      fmt1Prod.AsString  := s1;
      fmt1Stage.AsString := s2;
      mt1.Post;
    End;
  End;
End;

我在 Form2 上放置了一个 TGrid 和一个 TListView。两者都绑定(bind)到数据集。数据和计算字段在 TGrid 中正确显示(仅供检查)。

TListView 与数据集绑定(bind)如下:

Synch            <-> *
ItemHeader.Text  <-  Prod
ItemHeader.Break <-  Prod
Item.Text        <-  Search
Item.Detail      <-  Stage

我这样做是因为我找不到一种方法让 TListView 搜索框可以处理除项目文本之外的任何内容。好吧……但这可以解决:

  • 将 TListView.ItemAppeance 设置为自定义
  • 在结构体中找到TListView/ItemAppearance/Item/Text对象,并将Visible设置为False
  • 在结构体中找到TListView/ItemAppearance/Item/Detail对象,并将Visible设置为True

我不确定以上所有内容是否必要,但它确实有效。如果您的 TListView 是可编辑的,那么您可能还需要摆弄 ItemEditAppearance。

请记住,通过自定义项目外观,您实际上可以将 ListView 项目设置为您想要的任何外观。您可以添加和删除标签、图像和其他内容。它不像设计表单那么强大,但您可以用它做很多事情。但这里您真正需要的是隐藏搜索文本并在项目中的某处显示舞台文本。

并且......对于更复杂的项目外观,您可能需要进行一些代码绑定(bind)(尽管不确定)。

关于delphi - 如何搜索 FMX.TListView header 以及项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57649719/

相关文章:

delphi - Delphi 单元名称的 XMLDoc

delphi - 是否记录了 Set 类型的星号运算符?

android - MultiView 首秀,FPS 很低的动画

delphi - 有没有办法在还没有添加 child 时显示 TTreeNode 的 > 标志?

json - 将 JSON 解析为 TListBox

C++ 生成器 : Refresh FireMonkey Visual Component

delphi - 在delphi中更改文本颜色(控制台应用程序)

delphi - 如何为我的项目中的每个表单创建一个实例?

delphi XE多单元命名空间问题

delphi - 我能否找出在第 3 方 VCL 组件中,当我关闭包含该组件的项目时,导致 Delphi IDE 停止响应的原因?