今天将一个程序升级到了 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)。