扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
实现这样的转换可以有好几种方法。
一种是静态转换。所谓静态,即是在设计字段或制作表头时,修改其相关Lebel 或 DisplayLabel。无论该字段是否引用或参照别的字段,一旦形成可执行的组件对象,这中形式也就随之固定下来。到了实际运行时,这时的形式也可以满足一般的需求。但是这种形式不具备伸缩性,也不具备可扩充性。
另一种是动态修改。我们从 TTable 控件得知,Fields 属性是该 Table 的字段属性,而其每一字段的 DisplayLabel 属性是在运行时可以改动的。利用这一点,我门可以制作一个通用的作用于 TDataSet 的控件,使其具有数据感知功能,在数据库加载时替我们做这个动态转换。至于控件对象选用 TDataset 而不选用 Table(TQuery)是出于移植性的考虑。
下面说一说其工作原理。
当一 Delphi 的执行程序加载到内存当中时,它首先是完成各成员对象的初始化即完成 Load 事件,然后才根据需要执行各组件的 Create,对于继承自 TDataSet的TTable、TQuery 等也不例外。我们关心的是 Form 的 Close事件和 TTDataSet 的 Open 和 Close 事件,当我们连结(HOOK)到这些对象的Notify事件,也就具备了被事件驱动(唤醒)的功能。SetEnevts 和 RestoreEvents 这两个过程是起到在Load(装载)时设置主单元 Form和 TDataSet 的OPen和Close 事件,在关闭(主单元或数据库)时,恢复其原来的事件。GetForm 为获取主单元的窗体的过程。IniFileName 为保存有字段中英文对照表的 INI 文件。
其格式如下:
[DEFAULT] ; 设置为缺省库 RKSJ=入库时间 ;字段名 RKSJ 中文: 入库时间 DJ=单价 ;字段名 DJ 模旱ゼ? YS=颜色 ;字段名 YS 中文:颜色 BZ=备注 ;字段名 BZ 中文:备注 [DEFAULT_SIZE] ;缺省库字段长度 RKSJ=12 ;字段 RKSJ 显示长度为 12 DJ=8 ;字段 DJ 显示长度为 8 YS=10 ;字段 YS 显示长度为 10 BZ=40 ;字段 BZ 显示长度为 40
IniSection 指定该库(TTable,TQuery) 位于 IniFileName 的哪一区。我们看到在 Load 这个重载过程中,有一个Loading 的变量,它是为了防止在构建Form或DataMoudle时加载了SetEvents, 而我们的目的是在运行时设置,而不是在 Delphi的集成环境里进行 Form 的设计时。在 Save 的过程中,IniFileName 的存取位置在该执行程序的目录下,Save 过程分为两部分进行。
当用户指定了IniSection 时,对于本 FDataSet 的字段都将放在指定的 IniSection 区中, 期间对以前的任何数据不作保留。
当用户没有指定 Inisection 时,FDataSet 的字段都将放在 Default(缺省)区中,此时对保存的 FDataSet 字段做进一步的更新处理。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者