大家好,之前用VCL,cxGrid简直是太好用了,最近一直忙活FMX,FMX在界面的设计等一些功能上确实要好很多,又能跨平台,唯独现在表格控件比较让有郁闷,功能实在太少
大家有没有可以推荐的第三方表格控件可以使用?我也搜了一下,有人推荐过TeeGrid,但我在官网看了一下,不具备排序和筛选功能
大家好,之前用VCL,cxGrid简直是太好用了,最近一直忙活FMX,FMX在界面的设计等一些功能上确实要好很多,又能跨平台,唯独现在表格控件比较让有郁闷,功能实在太少
大家有没有可以推荐的第三方表格控件可以使用?我也搜了一下,有人推荐过TeeGrid,但我在官网看了一下,不具备排序和筛选功能
引自免费微信小程序:皆我百晓生
在Delphi FMX中,标准的报表控件TGrid
并不支持内置的排序和筛选功能。不过,你可以通过一些编程技巧实现这些功能。这里我将为你介绍一种基本的方法来实现排序和筛选。
首先,你需要一个数据源,例如TFMXObjectList
,它是一个适合用于绑定到网格的数据容器。然后,我们可以创建自定义的排序和筛选方法。
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.
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 的表格组件,它们提供了更全面的功能,包括内置的排序和过滤。但是,这通常需要购买许可证。