首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

解決 EhLib 4.1 在 Delphi 2007 下無法過濾排序的問題

     編輯:Delphi

將 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;
...

重新編譯後一切正常。

附帶說明

  1. 修正後的 DBUtilsEh.pas 檔案
  2. Delphi 2007 安裝 EhLib 4.1 會報錯,註解掉 EhLibVCL.pas 中 TBytes = array of Byte 一行即可正常安裝(Delphi 2007 已內建 TBytes 定義)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved