8 8
下载了EhLib 4.2 并进行试用后,决定对其进行汉化,以方便中文化的程序开发。因其整个库变化不大,并且以前汉化修改过 EhLib 3.6、EhLib 4.1 等,所以该版的汉化非常简单,和以前的相关文件进行对比汉化差异部分即可,所以整个汉化很快速地完成了。
EhLib 4.2.12 中文汉化版下载:http://www.2ccc.com
在试用 EhLib 4.2 的过程中,发现该版本 Readme.txt 文件标识是 4.2.12 Beta 版,EhLib 官方网站提供的试用版是 EhLib 4.2.16,所以,4.2.12 可能真的不是 EhLib 4.2 的正式版。
EhLib 4.2 最大的变化是增加了指示器标题(IndicatorTitle),该汉化版汉化了默认的全局菜单:

EhLib 的打印预览,该汉化版更改了按钮风格,添加了图标,更加美观:

EhLib 汉化后的打印设置界面:

EhLib 自带的 Grid 查找功能,汉化了所有细节:

EhLib 4.2.12 中文汉化版详细修改的内容:
1. DataService\EhLibADO.pas
第40行,ADODataSetDriverName函数:
原:Result := ‘MSACCESS’
现:Result := ‘MSSQL’
功能:字符串、日期界定符匹配(STFilter.Local=False情况下)
2.Common\EhLibConsts.pas
功能:常数汉化
3.Common\DBGridEhFindDlgs.pas\dfm
A、FillColumnsList函数:
原:cbFindIn.Items.AddObject(’<All>’, nil);
现:cbFindIn.Items.AddObject(‘<全部>’, nil);
B、界面中ComboBox中Items及KeyItems及Text汉化;
C、主界面汉化;
4.Common\PrnDgDlg.pas\dfm
功能:界面汉化
5.Common\PrvFrmEh.pas\dfm
功能:界面汉化
6.Common\PrViewEh.pas
327行 TPreviewBox.Create 方法. 由 FViewMode = vmFullPage 改为 FViewMode = vm100
7.Common\DBUtilsEh.pas
GetOneExpressionAsLocalFilterString 和 GetOneExpressionAsSQLWhereString 函数
功能:查询行字符串查询默认为LIKE查询.
6 8
EhLib 4.2 已经发布很长时间了,但各大 Delphi 下载站均没有出现下载,当然下载迟早肯定会有,只是个时间问题了。
今天浏览 51Delphi 窑洞,下载终于出现,版本是 EhLib 4.2.12,下载到这里:http://www.51delphi.com/delphi/soft/。
马上下载,打开浏览相关文件,目录结构没有变化,只是多了 Delphi 2007 目录。查看 Readme.txt, 内容显示:
EhLib 4.2 Beta 4 Build 4.2.12 Russian version. Full source included.
——————————————————————-
看样子是 Beta 版?
在 Delphi 2007 下尝试安装,一切都很顺利,安装过程中没有出现任何的警告和错误提示。
打开 Ehlib DEMO 运行,一切正常,相关提示及打印预览设置界面都为英文。
这一版本最主要的变化是增加了一个 IndicatorTitle 属性,即 Grid 指示器标题,他要实现的效果如下图:

目的就是使指示器列的标题可点击,可弹出一个下拉菜单,该功能由下图所示的 IndicatorTitle 属性设置:

设置 IndicatorTitle.TitleButton := True 即可启用指示器标题,设置 IndicatorTitle.ShowDropDownSign := True 可在指示器标题处显示一个下拉箭头标记,设置 IndicatorTitle.UserGlobalMenu := True 点击标题弹出的是 EhLib 默认的全局菜单,如果设为 False,弹出的即为 IndicatorTitle.DropdownMenu 指定的菜单。
全局菜单(GlobalMenu)即每个 DBGridEh 默认显示的菜单,如果对 EhLib 提供的默认全局菜单不满意,可以设置 EhLib 全局变量 DBGridEhCenter.IndicatorTitleMenus 属性和 IndicatorTitleMenus.OnBuildIndicatorTitleMenu 方法,具体可以查看 EhLib 的 History.txt 文件。
EhLib 有一属性 FrozenCols,可以指定 Grid 要冻结的列,即在 Grid 横向滚动时这些列不同时滚动,FrozenCols 设定的冻结列出现在 Grid 的左侧;刚发现 EhLib 有一属性 ContraColCount(可能以前的版本就有了该属性),他可以在 Grid 的右侧产生冻结列,在做一些财务类程序时,该属性有时也非常有用。
再等待一段时间,如果确认该版本是 EhLib 4.2 正式版,就决定开始汉化该版本了。
PS:EhLib 4.2 已汉化:EhLib 4.2.12 中文汉化版(OneFly.org 修改版)发布
30 7
今天将一个程序升级到了 Delphi 2007,该程序是用Delphi7开发的,程序中用到了一个第三方组件EhLib。
原先的 EhLib 是v3.6,无法在Delphi2007下安装,所以安装了最新的 v4.1。
原先正常的程序,在升级后,发现 DBGridEh 无法进行排序和过滤,执行操作时无反应。后来发现,如果选择本地过滤和排序的话,一切都会正常;如果是服务器端排序和过滤,则无法正常执行,错误信息为类型转换错误。
跟踪EhLib代码发现,是DBUtilsEh.pas文件中的SetDataSetSQLLikeProp 和IsDataSetHaveSQLLikeProp 函数中的以下相关代码报错:
……
if (TObject(GetOrdProp(DataSet, FPropInfo)) as TStrings) <> nil then
SQLPropValue := (TObject(GetOrdProp(DataSet, FPropInfo)) as TStrings).Text
……
具体的类型转换错误是指TObject与TStrings转换错误,所以报错。
我用的是ADOQuery,其SQL属性在Delphi7下是TStrings类型,在Delphi2007下是TWideStrings,由TObject转换为TStrings按理说不应该转换不成功啊。
继续查看代码才发现:
TWideStrings没有继承自TStrings,而是继承自TPersistent,理论上跟TStrings没有关系,将他转换为TStrings,当然会报错了。
找到原因后,将EhLib相关出错函数的代码改为以下:
……
if TObject(GetOrdProp(DataSet, FPropInfo)) is TStrings then
SQLPropValue := (TObject(GetOrdProp(DataSet, FPropInfo)) as TStrings).Text
else if TObject(GetOrdProp(DataSet, FPropInfo)) is TWideStrings then
SQLPropValue := (TObject(GetOrdProp(DataSet, FPropInfo)) as TWideStrings).Text
else
Exit;
……
修改后,重新编译,一切正常。
附1:修改后的DBUtilsEh.pas文件;
附2:在Delphi2007中安装EhLib4.1时会报错,注释掉EhLibVCL.pas文件中的“TBytes = array of Byte”行即可正常安装(Delphi2007自己定义了TBytes)。