【问题标题】:Best strategy for too many Elements in FireMoneky TListView Item [duplicate]FireMonkey ListView Item中过多元素的最佳策略[重复]
【发布时间】:2015-11-07 14:53:33
【问题描述】:

相信我,在寻求帮助之前我已经完成了作业。我花了最后 3 天的时间搜索和阅读,但我无法找到解决方案。因此,我们将不胜感激任何帮助。

我的任务是让一个 ListView 连接到一个数据集,其中 ListView 项具有以下结构:

请记住

  1. 元素 4、6 和 8 具有固定值和颜色(即标签)
  2. 元素 1 和 10 的颜色取决于元素 5、7 和 9 的值

我得到的最好的是对 Delphi 标准示例的引用,该示例随 Embarcadero Delphi 示例目录转移:ListViewMultiDetailAppearance。 这个解决方案可以为 MutliDetailItemAppearance 创建我们自己的类,并根据需要注册尽可能多的细节(在我的情况下,我认为我需要额外的 8 个)。

现在我的问题:

  1. 这是最好的方法吗?
  2. 如果不是,更好的方法是什么?
  3. 如果是,添加额外的 8 个细节将如何影响 性能?
  4. 以及最重要的如何实现元素的自定义着色 每个列表视图项基于值?
  5. 最后如何到达这个部分的边界?和列表项底部 边界(绿线)?

非常感谢您提前提出的想法。

【问题讨论】:

  • 数字 4 将受到另一个问题的影响,我不确定您在数字 5 中的意思。但我确信在我提供的代码中可以很容易地计算出 4。
  • @JerryDodge 在图片中您会看到 3 个部分之间的垂直线。和整个列表视图项的底部绿线。至于4号,有什么想法吗?
  • 可以自定义TListItemText 以匹配您想要的任何字体样式,对于线条,您可以从TListItemObject 继承您自己的类并根据需要进行绘图。
  • @JerryDodge 在我看来,您的stackoverflow.com/questions/29339179/… 答案就是答案。现在,如果您只能详细说明在 TListItemText 旁边可以使用哪些其他对象,并且您还可以详细说明上面关于继承 TListItemObject 以根据需要进行绘图的评论。最后,如果我们谈论链接到 DataSet,您认为捕获 DataSet 值的群体以列出项目以便我们可以将正确的值分配给正确的对象的最佳位置是什么?
  • @JerryDodge 还有一个问题,你建议如何关闭这个问题?

标签: delphi firemonkey delphi-xe5 delphi-xe8


【解决方案1】:

我不确定我的方法是否正确,但我在我的 fmx 项目中将 TListbox 用于类似目的。从DataSourceLiveBindings填充时,其item的结构是这样形成的。

procedure THMICD10Fr.LinkListControlToField1FillingListItem(Sender: TObject;
  const AEditor: IBindListEditorItem);
begin
  if (Assigned(AEditor)) and (HDM2.FDQicd_detail_for_TreeView.Active) then
    try
      if (AEditor.CurrentObject as TMetropolisUIListBoxItem).ChildrenCount = 2
      then
      begin

        with TPanel.Create(AEditor.CurrentObject as TMetropolisUIListBoxItem) do
        begin
          Parent := (AEditor.CurrentObject as TMetropolisUIListBoxItem);
          Align := TAlignLayout.alRight;
          Width := 45;
          Margins.Bottom := 1;
          Margins.Top := 1;
        end;

        with TLabel.Create((AEditor.CurrentObject as TMetropolisUIListBoxItem)
          .Children.Items[2] as TPanel) do
        begin
          Parent := (AEditor.CurrentObject as TMetropolisUIListBoxItem)
            .Children.Items[2] as TPanel;
          Text := '↓';
          VertTextAlign := TTextAlign.taCenter;
          TextAlign := TTextAlign.taCenter;
          Align := TAlignLayout.alClient;
          HitTest := true;
          AutoSize := false;
          StyledSettings := StyledSettings - [TStyledSetting.ssStyle];
          Font.Style := Font.Style + [TFontStyle.fsBold];
          Tag := HDM2.FDQicd_detail_for_TreeView.FieldByName('id').AsInteger;
          TagString := HDM2.FDQicd_detail_for_TreeView.FieldByName
            ('category_etiology').AsString;
          OnClick := LabelInListBox1Click;
        end;
      end;

    except

    end;
end;

这段代码给了我以下外观:

您可以在 Item 中创建和嵌套所有必要的 TLayoutsTLabels 等,并使用 LiveBindings 事件处理程序内部的逻辑设置所有必要的设置。

【讨论】:

  • 谢谢@asd-tm 不幸的是,出于性能原因,使用 TListBox 不是一种选择。我想,如果我可以在我的应用程序中使用 TListBox,这将是一个完美的方法,但我确实需要一个与 TListView 相关的解决方案。
  • 谢谢,但是你不能在处理 OnFillingListItemEvent 时对 TListView 项目做同样的事情吗?因为它与容器的类型无关,而是与 LiveBindings 机制有关?
  • 我猜不是。因为 TListView 项目不接受子控件。是吗?
  • @OussamaAlRifai 您可以在TListView 中制作自己的绘制元素。虽然不一定有任何控制。见这里:stackoverflow.com/questions/29339179/…
  • @OussamaAlRifai 我对我链接的其他问题的回答正是您所需要的。如果这解决了您的问题,那么您的问题应该作为副本关闭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2012-01-22
  • 2020-03-09
  • 2018-11-21
  • 2021-02-07
  • 2014-07-04
  • 1970-01-01
相关资源
最近更新 更多