Сортировка в RxDBGrid
Модератор: Модераторы
Сортировка в RxDBGrid
В RxDBGrid неправильно сортируется русский текст. Кто-нибудь сталкивался с этой проблемой?
TRxMemoryData, в примере \Demos\RxDBGrid
Добавлено спустя 13 часов 39 минут 28 секунд:
Версия библиотеки последняя, скачанная с svn.
Добавлено спустя 13 часов 39 минут 28 секунд:
Версия библиотеки последняя, скачанная с svn.
Так как насчет сортировки?
Вам же ответили Grid не сортирует. Класс грида ищет в своем списке зарегитрированных классов для сортировки, класс соответствующий типу DataSet. При клике на колонку в гриде создает экземпляр класса сортировки и вызывает функцию Sort для изменения сортировки, но реально сортирует сам dataset! И чтобы сортировка работала нужно написать класс сортировщик перекрыть функцию Sort в которой .... например для компонента из палитры SQLdb нужно закрыть Dataset подставить в sql запрос order by НОВОЕ_ПОЛЕ_СОРТИРОВКИ а потом открыть Dataset снова. Как видите грид не сортирует сам. Вот как то так примерно, если что автор компонента меня поправит 
Вопрос не в том. Если рассматривать пример из svn компоненты RXLib \Demos\RxDBGrid. То там в качестве DataSet используется RxMemoryData. При добавлении в DataSet строк "Алексей", "Иван", "Сергей", "Петр", "Ярослав" - строки сортируются как то неправильно. 
я к чему это всё.... дело не в гриде ... может быть в rxMemoryData....нужно копать:
rxmemds.pas
и дальше
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
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 писал(а):я к чему это всё.... дело не в гриде ... может быть в 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
Не правильно делаете! Уберите лишнее преобразование из Wide в UTF-8!
Не правильно делаете! Уберите лишнее преобразование из Wide в UTF-8!
Код: Выделить всё
result := WideCompareText(UTF8Decode(PChar(Data1)), UTF8Decode(PChar(Data1)));