Сортировка в RxDBGrid

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Сортировка в RxDBGrid

Сообщение alexkam » 04.12.2009 21:45:46

В RxDBGrid неправильно сортируется русский текст. Кто-нибудь сталкивался с этой проблемой?
alexkam
постоялец
 
Сообщения: 152
Зарегистрирован: 07.09.2009 20:03:59

Re: Сортировка в RxDBGrid

Сообщение alexs » 04.12.2009 22:24:56

RxDBGrid не умеет сам сортировать текст - это делает какой-то набор данных
а вот какой - вы это скажите
и какой версией библиотеки пользуетесь?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Сортировка в RxDBGrid

Сообщение alexkam » 04.12.2009 23:16:00

TRxMemoryData, в примере \Demos\RxDBGrid

Добавлено спустя 13 часов 39 минут 28 секунд:
Версия библиотеки последняя, скачанная с svn.
alexkam
постоялец
 
Сообщения: 152
Зарегистрирован: 07.09.2009 20:03:59

Re: Сортировка в RxDBGrid

Сообщение alexkam » 08.12.2009 19:01:57

Так как насчет сортировки?
alexkam
постоялец
 
Сообщения: 152
Зарегистрирован: 07.09.2009 20:03:59

Re: Сортировка в RxDBGrid

Сообщение Inferno » 08.12.2009 20:54:41

Вам же ответили Grid не сортирует. Класс грида ищет в своем списке зарегитрированных классов для сортировки, класс соответствующий типу DataSet. При клике на колонку в гриде создает экземпляр класса сортировки и вызывает функцию Sort для изменения сортировки, но реально сортирует сам dataset! И чтобы сортировка работала нужно написать класс сортировщик перекрыть функцию Sort в которой .... например для компонента из палитры SQLdb нужно закрыть Dataset подставить в sql запрос order by НОВОЕ_ПОЛЕ_СОРТИРОВКИ а потом открыть Dataset снова. Как видите грид не сортирует сам. Вот как то так примерно, если что автор компонента меня поправит :)
Аватара пользователя
Inferno
новенький
 
Сообщения: 78
Зарегистрирован: 20.03.2009 14:40:20
Откуда: Тюмень

Re: Сортировка в RxDBGrid

Сообщение alexkam » 08.12.2009 21:37:36

Вопрос не в том. Если рассматривать пример из svn компоненты RXLib \Demos\RxDBGrid. То там в качестве DataSet используется RxMemoryData. При добавлении в DataSet строк "Алексей", "Иван", "Сергей", "Петр", "Ярослав" - строки сортируются как то неправильно. :?:
alexkam
постоялец
 
Сообщения: 152
Зарегистрирован: 07.09.2009 20:03:59

Re: Сортировка в RxDBGrid

Сообщение Inferno » 09.12.2009 07:34:18

я к чему это всё.... дело не в гриде ... может быть в rxMemoryData....нужно копать:
rxmemds.pas
Код: Выделить всё
function CompareFields(Data1, Data2: Pointer; FieldType: TFieldType;
  CaseInsensitive: Boolean): Integer;
begin
  Result := 0;
  case FieldType of
    ftString:
      if CaseInsensitive then
        Result := AnsiCompareText(PChar(Data1), PChar(Data2))
      else
        Result := AnsiCompareStr(PChar(Data1), PChar(Data2)); 


и дальше
function AnsiCompareText(const S1, S2: string): integer;{$ifdef SYSUTILSINLINE}inline;{$endif}
function AnsiCompareStr(const S1, S2: string): integer;{$ifdef SYSUTILSINLINE}inline;{$endif}

может быть в компоненте
AnsiCompareText, AnsiCompareStr заменить на CompareText,CompareStr. сам не пробовал
ммм....
У меня вообще этот пример не работает. падает в AV на строке PBoolean(Pointer(Data))^:= Assigned(Buffer); в RxMemoryData.SetFieldData(Field: TField; Buffer: Pointer);
Есть подозрения из-за того что криво писано для 64бит. у меня как раз 64 битный linux
Аватара пользователя
Inferno
новенький
 
Сообщения: 78
Зарегистрирован: 20.03.2009 14:40:20
Откуда: Тюмень

Re: Сортировка в RxDBGrid

Сообщение alexs » 09.12.2009 20:56:37

Сегодня специально проверил. Работает нормально.
Fedora 11. лазарь и фпс вчерашний транк.

Версия лазаря, ОС?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Сортировка в RxDBGrid

Сообщение alexkam » 27.12.2009 17:27:02

Inferno писал(а):я к чему это всё.... дело не в гриде ... может быть в rxMemoryData....нужно копать:
rxmemds.pas
Код: Выделить всё
function CompareFields(Data1, Data2: Pointer; FieldType: TFieldType;
  CaseInsensitive: Boolean): Integer;
begin
  Result := 0;
  case FieldType of
    ftString:
      if CaseInsensitive then
        Result := AnsiCompareText(PChar(Data1), PChar(Data2))
      else
        Result := AnsiCompareStr(PChar(Data1), PChar(Data2)); 


и дальше
function AnsiCompareText(const S1, S2: string): integer;{$ifdef SYSUTILSINLINE}inline;{$endif}
function AnsiCompareStr(const S1, S2: string): integer;{$ifdef SYSUTILSINLINE}inline;{$endif}

может быть в компоненте
AnsiCompareText, AnsiCompareStr заменить на CompareText,CompareStr. сам не пробовал
ммм....
У меня вообще этот пример не работает. падает в AV на строке PBoolean(Pointer(Data))^:= Assigned(Buffer); в RxMemoryData.SetFieldData(Field: TField; Buffer: Pointer);
Есть подозрения из-за того что криво писано для 64бит. у меня как раз 64 битный linux


Получилось так:
result := CompareStr(UTF8Encode(WideUpperCase(UTF8Decode(PChar(Data1)))), UTF8Encode(WideUpperCase(UTF8Decode(PChar(Data1)))));

OS Windows Vista, Lazarus 0.9.29
alexkam
постоялец
 
Сообщения: 152
Зарегистрирован: 07.09.2009 20:03:59

Re: Сортировка в RxDBGrid

Сообщение Mr.Smart » 27.12.2009 20:09:23

alexkam
Не правильно делаете! Уберите лишнее преобразование из Wide в UTF-8!
Код: Выделить всё
result := WideCompareText(UTF8Decode(PChar(Data1)), UTF8Decode(PChar(Data1)));
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 36

Рейтинг@Mail.ru