Delphi 6转2007:DevExpress TdxDBGridLayoutList替代方案咨询
替代TdxDBGridLayoutList实现多布局切换方案
一、模拟原有TdxDBGridLayoutList行为(针对Delphi 2007 + DevExpress 1.0.59)
旧组件TdxDBGridLayoutList的核心是预存多套网格布局并按需切换,可通过以下两种方式复刻该逻辑:
1. 布局文件/流存储法
利用TdxDBGrid自带的布局导入导出功能,保存原有两套布局:
- 导出布局:设计时先将
TdxDBGrid配置为LAYOUT_A样式(带区、列类型、字段关联等),调用代码导出配置:
也可用流存储避免文件依赖:// 导出LAYOUT_A到INI文件 dxDBGrid1.SaveToIniFile('layout_a.ini'); // 配置LAYOUT_B后执行相同导出操作 dxDBGrid1.SaveToIniFile('layout_b.ini');var Stream: TMemoryStream; begin Stream := TMemoryStream.Create; try dxDBGrid1.SaveToStream(Stream); Stream.SaveToFile('layout_a.dat'); finally Stream.Free; end; end; - 加载布局:窗体创建时根据功能需求加载对应布局:
注意:加载前建议暂停数据集(// 加载LAYOUT_A dxDBGrid1.LoadFromIniFile('layout_a.ini'); // 或从流加载 var Stream: TMemoryStream; begin Stream := TMemoryStream.Create; try Stream.LoadFromFile('layout_a.dat'); Stream.Position := 0; dxDBGrid1.LoadFromStream(Stream); finally Stream.Free; end; end;DataSet.Active := False),加载完成后再激活,避免字段关联报错。
2. 代码动态创建布局
如果不想依赖外部文件,可在数据模块中编写两个布局创建过程,按需调用:
- 清空原有布局:
dxDBGrid1.Bands.Clear; dxDBGrid1.Columns.Clear; - 创建LAYOUT_A示例:
procedure CreateLayoutA(ADBGrid: TdxDBGrid); var MainBand: TdxTreeListBand; DateCol: TDBGridMaskColumn; StrCol: TDBGridMaskColumn; // 声明其他列变量... begin // 创建主带区 MainBand := ADBGrid.Bands.Add; MainBand.Caption := '基础信息'; // 创建日期列 DateCol := ADBGrid.Columns.Add as TDBGridMaskColumn; DateCol.FieldName := 'CreateDate'; DateCol.DataType := ftDate; DateCol.Caption := '创建日期'; // 创建字符串列 StrCol := ADBGrid.Columns.Add as TDBGridMaskColumn; StrCol.FieldName := 'UserName'; StrCol.DataType := ftString; StrCol.Caption := '用户名'; // 依次添加剩余8个列... end; - 切换布局:
// 切换到LAYOUT_A dxDBGrid1.Bands.Clear; dxDBGrid1.Columns.Clear; CreateLayoutA(dxDBGrid1); // 切换到LAYOUT_B则调用对应的CreateLayoutB过程
二、TcxGrid替代方案的可行性
TcxGrid是DevExpress后续版本的主推网格组件,也是你升级到XE的最优选择,适配问题可通过以下方式解决:
1. 布局迁移
- 设计时删除旧的
TdxDBGrid,拖入TcxGrid并绑定相同数据源; - 对照原有
LAYOUT_A和LAYOUT_B的配置,在cxGrid的TableView中创建对应带区和列,设置字段关联、数据类型、列宽等属性,保持原有界面风格。
2. 多布局切换
TcxGrid自带更完善的布局管理:
- 使用
TcxGridLayoutStore组件:拖入该组件并关联目标cxGridTableView,设计时可直接在组件编辑器中保存多套布局,运行时通过ActiveLayoutName切换:// 切换到LAYOUT_A cxGridLayoutStore1.ActiveLayoutName := 'LAYOUT_A'; // 切换到LAYOUT_B cxGridLayoutStore1.ActiveLayoutName := 'LAYOUT_B'; - 也可用代码导入导出布局,逻辑和
TdxDBGrid类似:cxGridTableView1.StoreToIniFile('cx_layout_a.ini'); cxGridTableView1.LoadFromIniFile('cx_layout_a.ini');
3. 窗体适配注意事项
- 先将
TcxGrid的尺寸设置为和旧TdxDBGrid完全一致,再调整内部列宽,减少界面差异; - 检查事件绑定:
TcxGrid的事件和TdxDBGrid有部分差异,比如旧的OnCellClick对应cxGridTableView1.OnCellClick,OnEdit对应OnEditing,逐个替换即可; - 确保字段关联一致:
cxGrid列的DataBinding.FieldName要和数据集字段名完全匹配。
三、后续升级到XE的提前准备
XE版本中TdxDBGrid系列已被淘汰,建议优先采用TcxGrid方案,避免后续二次迁移:
- 尽量使用跨版本兼容的API,避免依赖Delphi 2007专属特性;
- 布局存储优先用流格式,减少INI文件的编码兼容问题。
内容的提问来源于stack exchange,提问作者Giansi87
相关产品推荐
相关产品推荐

