asutp2
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору <MyGrid>.<MyView>.DataController.Options.dcoSortByDisplayText := False это тоже установлено, но не помогает. Добавлено: В общем путем отладки выяснил, что данные внутри DataController почему то хранятся в виде string, а не TDateTime. В итоге решил сделать сравнение самостоятельно, вот рабочий код для XE7: procedure TFormMain.GridInvoicesTableViewDataControllerCompare( ADataController: TcxCustomDataController; ARecordIndex1, ARecordIndex2, AItemIndex: Integer; const V1, V2: Variant; var Compare: Integer); var IntlValue1: string; IntlValue2: string; IntlDate1: TDateTime; IntlDate2: TDateTime; IntlData: TVarData; // конвертация строки в формате 'dd.mm.yyyy' в дату function ConvertStringtoDate(const AValue: string): TDateTime; begin // результат Result := EncodeDate( StrToInt(Trim(Copy(AValue, 7, 4))), StrToInt(Trim(Copy(AValue, 4, 2))), StrToInt(Trim(Copy(AValue, 1, 2))) ); end; begin // поле типа "дата"? if AItemIndex = GridInvoicesTableViewColumnCreated.Index then begin // поле типа "дата" // значения даты в текстовом виде IntlValue1 := ADataController.Values[ARecordIndex1, AItemIndex]; IntlValue2 := ADataController.Values[ARecordIndex2, AItemIndex]; // значения даты в числовом виде IntlDate1 := ConvertStringtoDate(IntlValue1); IntlDate2 := ConvertStringtoDate(IntlValue2); // сравниваем Compare := IfThen( Trunc(IntlDate1) > Trunc(IntlDate2), 1, IfThen( Trunc(IntlDate1) < Trunc(IntlDate2), -1, 0 ) ); end else begin // поля иного типа, сравниваем стандартным способом case VarCompareValue(V1, V2) of vrEqual: // равны Compare := 0; vrLessThan: // первый параметр меньше Compare := -1; vrGreaterThan: // первый параметр больше Compare := 1; vrNotEqual: begin // один из параметров пустой, другой не пустой // данные первого параметра IntlData := FindVarData(V1)^; // первый параметр пустой? if IntlData.VType = varEmpty then // первый параметр пустой, значит первый параметр меньше второго Compare := -1 else // первый параметр не пустой, значит пустой второй и первый больше Compare := 1; end; end; end; end; |