Полезные компоненты для пользователей Delphi и С++Builder


         

Модуль DBFilter.pas


Оказывается (магическая комбинация ctrl+shift+пробел), что в функции TRxDBFilter.CreateExprFilter имеется ошибка - функция DbiAddFilter поменяла тип формального параметра при своем вызове. Исправляем этот факт (самое простое что можно сделать - это попытаться привести имеющуюся переменную к требуемому типу. Это может не пройти, но если не пройдет - тогда и будем думать:): function TRxDBFilter.CreateExprFilter: hDBIFilter; begin Result := nil; if (FFilter.Count > 0) then if BuildTree then try Check(DbiAddFilter((FDatalink.DataSet as TBDEDataSet).Handle, Longint(Self), FPriority, False, {$IFDEF RX_D5} pCANExpr( {$ENDIF} TExprParser(FParser).FilterData {$IFDEF RX_D5} ) {$ENDIF}, nil, Result)); FDataHandle := TBDEDataSet(FDatalink.DataSet).Handle; finally DestroyTree; end; end;

Пытаемся снова перекомпилировать библиотеку. Наталкиваемся на уже известную ошибку с несоответствием формальных и фактических параметров в модуле DBFilter. Оказывается, в D5 введен новый тип TFieldMap. Появляется он в единственном месте - при вызове TExprParser.Create в функции TRxDBFilter.BuildTree модуля DBFilter.pas В этом месте пишем: FParser := TExprParser.Create(FDataLink.DataSet, Expr, TFilterOptions(FOptions) {$IFDEF RX_D4}, [], '', nil{$ENDIF} {$IFDEF RX_D5} , FldTypeMap {$ENDIF});

Идея данного изменения была получена одним из нас при анализе конструктора TExprParser (модуль DBCommon). Естественно, что для введения таких изменений необходимо иметь исходный текст VCL. В случае его отсутствия (по каким-либо причинам) здесь можно было бы поставить выброс исключения (для того, чтобы данный участок кода себя как-то проявил при работе, а не просто ничего не делал). Функциональности от такого изменения немного, но это лучше, чем ничего.

Архивируем и перекомпилируем библиотеку. Исправляем уже известные ошибки



Содержание раздела