今天將一個程序升級到了 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)。