程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> EhLib 4.1在Delphi 2007下無法過濾和排序的問題

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

編輯:Delphi

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved