Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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日

悬赏问题

  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥100 解决数据不连续出现问题
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误