將 Delphi 7 專案升級至 Delphi 2007 時,原使用 EhLib v3.6 無法安裝,改裝最新 v4.1 後發現 DBGridEh 無法排序與過濾,操作無反應。經測試:選擇本地過濾/排序正常;伺服器端排序/過濾則報型別轉換錯誤。
追蹤原始碼發現,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 屬性在 Delphi 7 是 TStrings,Delphi 2007 變為 TWideStrings,按理 TObject 轉 TStrings 應成功。
深入檢視發現:TWideStrings 繼承自 TPersistent 而非 TStrings,理論上與 TStrings 無關係,強制轉型當然會錯。
將相關出錯函式修改為:
... 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; ...
重新編譯後一切正常。
DBUtilsEh.pas 檔案EhLibVCL.pas 中 TBytes = array of Byte 一行即可正常安裝(Delphi 2007 已內建 TBytes 定義)