【问题标题】:Delphi Firemonkey TListview - Header does not show if it is repetitionDelphi Firemonkey TListview - 标题不显示是否重复
【发布时间】:2021-02-15 19:44:35
【问题描述】:

Delphi 10.4 在 Windows 64 上运行,Android 显示同样的问题。我不认为这是一个错误,而是一个设置问题(我只是找不到设置)

如果我有连续的 Header 是相同文本的项目,firemonkey 版本的 TListView 不会显示第二个项目。

我只能找到 NativeOptions.Grouped=False,就设置而言,这是我能找到的最接近的东西。是否设置为 true/false 没有区别。

任何指针?下面附上一个最小的工作示例,它演示了这个问题。

type
  TForm1 = class(TForm)
    ListView1: TListView;
    Button1: TButton;
    FDMemTable1: TFDMemTable;
    BindSourceDB1: TBindSourceDB;
    FDMemTable1CustomerID: TIntegerField;
    FDMemTable1CustomerName: TStringField;
    BindSourceDB2: TBindSourceDB;
    BindingsList1: TBindingsList;
    procedure Button1Click(Sender: TObject);
  private
    FLinkFillControlToField : TLinkFillControlToField;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  with FDMemTable1 do
  begin
    Open;

    Append;
    FieldByName('CustomerID').AsInteger := 1;
    FieldByName('CustomerName').AsString := 'ABC';
    Post;

    Append;
    FieldByName('CustomerID').AsInteger := 2;
    FieldByName('CustomerName').AsString := 'XYZ';
    Post;

    Append;
    FieldByName('CustomerID').AsInteger := 3;
    FieldByName('CustomerName').AsString := 'XYZ';
    Post;
  end;

  if not Assigned(FLinkFillControlToField) then
  begin
    FLinkFillControlToField := TLinkFillControlToField.Create(BindingsList1);
    FLinkFillControlToField.Control := listview1;

    with FLinkFillControlToField do
    begin
      Category := 'Quick Bindings';
      Track := False;
      Direction := linkDataToControl;
      AutoActivate := False;
      AutoFill := True;
      BindSourceDB1.DataSource.Enabled := True;
      FillDataSource := BindSourceDB1;
    end;
  end;

  with FLinkFillControlToField do
  begin
    FillHeaderFieldName := 'CustomerName';

    with FillExpressions.AddExpression do
    begin
      SourceMemberName := 'CustomerID';
      ControlMemberName := 'Text1';
    end;
    with FillExpressions.AddExpression do
    begin
      SourceMemberName := 'CustomerName';
      ControlMemberName := 'Text2';
    end;
  end;
  FLinkFillControlToField.Active := True;
end;


object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 404
  ClientWidth = 763
  FormFactor.Width = 320
  FormFactor.Height = 480
  FormFactor.Devices = [Desktop]
  DesignerMasterStyle = 0
  object ListView1: TListView
    ItemAppearanceClassName = 'TDynamicAppearance'
    ItemEditAppearanceClassName = 'TDynamicAppearance'
    HeaderAppearanceClassName = 'TListHeaderObjects'
    FooterAppearanceClassName = 'TListHeaderObjects'
    Position.X = 16.000000000000000000
    Position.Y = 24.000000000000000000
    Size.Width = 561.000000000000000000
    Size.Height = 353.000000000000000000
    Size.PlatformDefault = False
    ItemAppearanceObjects.ItemObjects.ObjectsCollection = <
      item
        AppearanceObjectName = 'Text1'
        AppearanceClassName = 'TTextObjectAppearance'
        Appearance.Width = 223.000000000000000000
        Appearance.Height = 44.000000000000000000
      end
      item
        AppearanceObjectName = 'Text2'
        AppearanceClassName = 'TTextObjectAppearance'
        Appearance.Width = 208.000000000000000000
        Appearance.Height = 44.000000000000000000
        Appearance.PlaceOffset.X = 326.000000000000000000
      end>
    ItemAppearanceObjects.ItemEditObjects.ObjectsCollection = <
      item
        AppearanceObjectName = 'Text1'
        AppearanceClassName = 'TTextObjectAppearance'
      end>
  end
  object Button1: TButton
    Position.X = 592.000000000000000000
    Position.Y = 24.000000000000000000
    Size.Width = 161.000000000000000000
    Size.Height = 57.000000000000000000
    Size.PlatformDefault = False
    Text = 'Button1'
    OnClick = Button1Click
  end
  object FDMemTable1: TFDMemTable
    FetchOptions.AssignedValues = [evMode]
    FetchOptions.Mode = fmAll
    ResourceOptions.AssignedValues = [rvSilentMode]
    ResourceOptions.SilentMode = True
    UpdateOptions.AssignedValues = [uvCheckRequired, uvAutoCommitUpdates]
    UpdateOptions.CheckRequired = False
    UpdateOptions.AutoCommitUpdates = True
    Left = 576
    Top = 128
    object FDMemTable1CustomerID: TIntegerField
      FieldName = 'CustomerID'
    end
    object FDMemTable1CustomerName: TStringField
      FieldName = 'CustomerName'
      Size = 30
    end
  end
  object BindSourceDB1: TBindSourceDB
    DataSet = FDMemTable1
    ScopeMappings = <>
    Left = 576
    Top = 192
  end
  object BindSourceDB2: TBindSourceDB
    DataSet = FDMemTable1
    ScopeMappings = <>
    Left = 576
    Top = 248
  end
  object BindingsList1: TBindingsList
    Methods = <>
    OutputConverters = <>
    Left = 20
    Top = 5
  end
end

【问题讨论】:

  • 你能写一个最小的程序来重现你遇到的问题吗?然后编辑您的问题以添加该程序源(.pas 和 .fmx)。顺便问一下,您使用的是哪个平台(Windows、Android...)?还有 Delphi 版本。
  • @fpiette,我发布了一个最小的示例。 Windows32/64。安卓也是同样的问题。德尔福 10.4。以前我没有发布示例,因为我不认为这是一个错误……它似乎更像是一个设置问题。如果紧随其后的标题不同,则显示标题。如果没有,它就会消失。
  • 我测试了你的代码,它似乎没问题:我看到带有记录 1 的“ABC”标题和带有记录 2 和 3 的“XYZ”标题。请添加你得到和绘制的屏幕转储一个箭头显示出了什么问题。我使用 Delphi 10.4.1 并在 Windows 应用程序中编写了您的代码。
  • 我的意思是我希望记录 3 有自己的 XYZ 标头。 (请参阅带有屏幕截图的原始帖子)
  • 我的结果和你一模一样。你确定你需要的不是简单的网格吗?

标签: listview delphi firemonkey


【解决方案1】:

我发现标头设计为以这种方式工作 - 如果连续的标头完全相同,它就不会重复。

所以我只是将文本移到“主要”部分,这样它就会在每条记录中重复。

感谢您在回复中提供帮助。

【讨论】:

  • 哦,我不知道这就是你之前的意思......我以为你的意思是使用 stringgrid 或之前的东西。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多