Delphi 11.3 FMX 多设备平台中使用 TGrid 实现类似 TDBGrid 的效果

博客介绍在Delphi Firemonkey中,因TDBGrid控件缺失,可用TGrid实现类似效果,以11.3版本为例讲解。还提到查询中数据库控件的一般用法可参考其他资料,重点介绍了通过界面配置,利用TStringGrid、TBindSourceDB等控件实现效果的方法。

Delphi Firemonkey 中 TDBGrid 这个控件已经没有了。如何实现类似这个效果呢。其实可以用TGrid 来实现。以下用 11.3 来讲解。

查询里面用到的 connection 和 query 等控件那些一般的数据库用法,就不做过多描述了。请参考其他资料。

方法一.通过界面配置来实现

在界面里面放入 TStringGrid 控件 StringGrid1,TBindSourceDB 控件 BindSourceDB1,TBindingsList 控件 BindingsList1 ,TButton 控件 Button1。

 在bindsourceDB1的dataset属性设置对应的 query控件名称。

双击 bindingslist1 控件,

 

增加一个 TLinkGridToDataSource 控件

首先说下控件功能如下: 1,可以设置固定行 和固定列.固定行和列是任何时候不许编辑的,但是可以代码修改设置 2,可以设置背景色(包括固定好和表格内部背景色,非固定单元格背景只对新建单元格有效) 3,可以合并单元格(横向竖向均可合并,支持横竖同时合并单元格效果) 4,边框线宽度可以设置(外边框线,内边框线可以分开设置) 5,边框颜色可以设置(内外线色可以设置不同颜色) 6,可以设置编辑状态(此属性是新建单元格属性,只对新建单元格生效) 7,只读属性(针对所有非固定单元格) 8,随时可以设置行数和列数(减少的话,末尾待减少储存数据会丢失) 9,增加是否立即刷新参数,可以在大量输入录入时快速执行 下面是单元格单独属性设置介绍 1,可以储存字符串 2,可以储存整数 3,可以储存文本(默认单元格内显示[DEMO],可以编辑实际内容或读取实际内容) 4,可以储存字符串列表(可以设置读取选择字符串) 5,可以储存日期(格式2018-07-06) 6,可以储存时间(格式10:26:32,设置智能设置到时分,直接赋值可以包含更精确单位) 7,可以设置日期(格式包含以上格式,设置同上.直接赋值可以保存更精确单位) 8,可以储存颜色(显示以保存颜色显示) 9,单元格字体,所有字体设置均支持(包含颜色,字体,换行,对齐等属性) 10,背景可以单独设置 10,可以单独设置是否允许编辑 详细使用请看使用说明
### 实现 Delphi FMX Grid 类似dbGridEH 功能 在 Delphi FireMonkey (FMX) 台下,`TGrid` 控件提供了基本的数据展示能力。为了实现 `dbGridEH` 的高级功能,在 TGrid 上扩展或自定义是必要的。 #### 数据绑定增强 对于数据源连接方面,可以利用 `TFDMemTable` 或者其他支持 LiveBindings 的组件来作为数据提供者[^1]。通过设置 `LiveBindings` 属性,能够使网格自动反映数据库中的变化: ```delphi procedure TForm1.FormCreate(Sender: TObject); begin FDMemTable1.CreateDataSet; BindSourceDB1.DataSet := FDMemTable1; LinkGridToDataSourceBindSourceDB1.DataSource := BindSourceDB1; end; ``` #### 列宽调整与固定列 允许用户手动改变各字段宽度,并保持某些特定列为冻结状态。这可以通过重载 `OnColumnResize` 和 `OnDrawColumnCell` 方法完成。当鼠标拖拽边界时触发前者事件处理程序;后者用于绘制单元格内容前执行逻辑判断是否属于锁定区域内的项目[^2]: ```delphi type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure Grid1ColumnResize(Sender: TObject; Column: TColumn); procedure Grid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas; const Bounds: TRectF; const Row, Col: Integer; const Value: TValue; var DefaultDrawing: Boolean); private FixedColumnsCount : integer; public end; ... // 设置固定的前列数 FixedColumnsCount := 2; procedure TForm1.Grid1ColumnResize(Sender: TObject; Column: TColumn); var i :integer ; begin if Assigned(Column) then begin for i:=0 to Grid1.Columns.Count-1 do if not Grid1.Columns[i].IsVisible and (i<FixedColumnsCount)then Grid1.Columns[i].Width := Column.Width; end; end; procedure TForm1.Grid1DrawColumnCell(Sender: TObject; const ACanvas: TCanvas; const ARect: TRectF; const ARow, ACol: Integer; const AValue: TValue; var ADrawingDefault: Boolean); begin if ACol < FixedColumnsCount then // 自定义画法... else ADrawingDefault := True; end; ``` #### 排序过滤操作 添加按钮或其他交互控件让用户指定排序依据以及条件筛选记录集。借助 SQL 查询语句或者内存表自带的方法达成目的。例如,针对某列点击升/降序排列可编写如下代码片段[^3]: ```delphi procedure TForm1.SortButtonClick(Sender: TObject); var FieldName:string; begin case Sender of btnSortAsc: begin FieldName := &#39;FieldName&#39;; // 替换成实际要排序的字段名 FDMemTable1.IndexFieldNames := &#39;&#39;; FDMemTable1.IndexDefs.Clear; with FDMemTable1.IndexDefs.AddIndexDef do try Name := &#39;OrderBy&#39;+FieldName+&#39;ASC&#39;; Fields := FieldName; Options := [ixDescending]; finally FDMemTable1.IndexName := &#39;OrderBy&#39;+FieldName+&#39;ASC&#39;; end; end; btnSortDesc: ... end; end; ``` 以上就是一些关于如何模仿 `dbGridEH` 特性的介绍,当然还有更多细节等待探索和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tjsoft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值