CSDN-Ada助手 2024-05-31 14:56 采纳率: 1.6%
浏览 8

DELPHI FMX有没有可以排序和筛选的表格控件,如何解决?

该问题来自社区帖: https://bbs.csdn.net/topics/618797028.

大家好,之前用VCL,cxGrid简直是太好用了,最近一直忙活FMX,FMX在界面的设计等一些功能上确实要好很多,又能跨平台,唯独现在表格控件比较让有郁闷,功能实在太少

大家有没有可以推荐的第三方表格控件可以使用?我也搜了一下,有人推荐过TeeGrid,但我在官网看了一下,不具备排序和筛选功能

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-31 14:56
    关注

    引自免费微信小程序:皆我百晓生

    在Delphi FMX中,标准的报表控件TGrid并不支持内置的排序和筛选功能。不过,你可以通过一些编程技巧实现这些功能。这里我将为你介绍一种基本的方法来实现排序和筛选。

    首先,你需要一个数据源,例如TFMXObjectList,它是一个适合用于绑定到网格的数据容器。然后,我们可以创建自定义的排序和筛选方法。

    1. 定义一个数据源类(比如TFMXDataObject):
    unit DataObjects;
    
    interface
    
    uses
      System.SysUtils, System.Classes, FMXObjectModel;
    
    type
      TFMXDataObject = class(TPersistent)
      private
        FDataSource: TCollection;
        FItemName: string;
        FSortOrder: TSortOrder;
        FFilter: string;
      public
        constructor Create(ADataSource: TCollection; AItemName: string);
        destructor Destroy; override;
    
        property DataSource: TCollection read FDataSource write FDataSource;
        property ItemName: string read FItemName write FItemName;
        property SortOrder: TSortOrder read FSortOrder write FSortOrder;
        property Filter: string read FFilter write FFilter;
    
        procedure ApplySortingAndFiltering;
      end;
    
    implementation
    
    constructor TFMXDataObject.Create(ADataSource: TCollection; AItemName: string);
    begin
      inherited Create;
      FDataSource := ADataSource;
      FItemName := AItemName;
    end;
    
    destructor TFMXDataObject.Destroy;
    begin
      inherited Destroy;
    end;
    
    procedure TFMXDataObject.ApplySortingAndFiltering;
    var
      i, j: Integer;
      TempItem: TFMXObject;
    begin
      if FDataSource <> nil then
      begin
        // 使用升序默认排序
        for i := 0 to FDataSource.Count - 2 do
          for j := i + 1 to FDataSource.Count - 1 do
            if CompareText(FDataSource[j].FindComponent(FItemName).ToString,
                           FDataSource[i].FindComponent(FItemName).ToString) <
               (FOrder = soDescending) * (-1) then
            begin
              TempItem := FDataSource[i];
              FDataSource[i] := FDataSource[j];
              FDataSource[j] := TempItem;
            end;
    
        // 过滤操作
        if FFilter <> '' then
        begin
          var NewDataSource := TCollection.Create;
          try
            for i := 0 to FDataSource.Count - 1 do
              if Pos(FFilter, FDataSource[i].FindComponent(FItemName).ToString) > 0 then
                NewDataSource.Add(FDataSource[i]);
            FDataSource.Assign(NewDataSource);
          finally
            NewDataSource.Free;
          end;
        end;
      end;
    end;
    
    end.
    
    1. 在你的主窗体单元中,添加一个TFMXDataObject实例,并设置数据源、排序项和过滤条件:
    unit MainFormUnit;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMXObjectModel,
      DataObjects;
    
    type
      TForm1 = class(TForm)
        Grid: TGrid;
        DataSource: TCollection;
        // ... 其他控件
      private
        FDataObject: TFMXDataObject;
        procedure SortButtonClick(Sender: TObject);
        procedure FilterButtonClick(Sender: TObject);
      public
        constructor Create(AOwner: TComponent); override;
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    uses
      System.StrUtils;
    
    constructor TForm1.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
    
      DataSource := TCollection.Create;
      // 添加数据到DataSource,例如:
      // DataSource.Add(TFMXObject.Create(nil));
      // DataSource[0].AddProperty('Field1', 'Value1');
      // DataSource[0].AddProperty('Field2', 'Value2');
    
      FDataObject := TFMXDataObject.Create(DataSource, 'FieldNameToSortAndFilter');
      Grid.DataSource := DataSource;
      Grid.ItemIndexComparator := FDataObject.CompareItems;
      // ... 其他初始化代码
    end;
    
    procedure TForm1.SortButtonClick(Sender: TObject);
    begin
      case Grid.RowSortedBy of
        -1: FDataObject.SortOrder := soAscending;
        soAscending: FDataObject.SortOrder := soDescending;
        soDescending: FDataObject.SortOrder := soNone;
      end;
      FDataObject.ApplySortingAndFiltering;
      Grid.Repaint;
    end;
    
    procedure TForm1.FilterButtonClick(Sender: TObject);
    var
      FilterString: string;
    begin
      FilterString := InputBox('Enter filter text', 'Filter', '');
      FDataObject.Filter := FilterString;
      FDataObject.ApplySortingAndFiltering;
      Grid.Repaint;
    end;
    
    end.
    

    在这个例子中,我们创建了一个名为TFMXDataObject的类,用于存储排序和筛选信息。当点击排序按钮时,会根据当前的排序状态切换排序顺序。点击过滤按钮时,会提示用户输入过滤文本,然后应用过滤条件。这两个事件都需要重新绘制网格以便显示更新后的数据。

    注意,这个方法依赖于手动重绘网格,如果你有大量的数据,可能会影响性能。对于更复杂的需求,可能需要考虑使用更专业的第三方控件,如 DevExpress 或 ComponentOne 的表格组件,它们提供了更全面的功能,包括内置的排序和过滤。但是,这通常需要购买许可证。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月31日

悬赏问题

  • ¥100 有偿寻云闪付SDK转URL技术
  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型