Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сортировка в ListBox [D4, Win95/98, WinXP]


Германн ©   (2006-03-14 17:55:00) 

Может кто-нибудь объяснить такую сортировку:
001
0-01
002

Почему строка 0-01 ниже строки 001? Чем тире такое особенное?


Германн   (2006-03-15 16:34:00) [1]


> Desdechado ©   (15.03.06 12:37) [12]
>
> Про подчеркивания я говорил. Эта фича AFAIR появиласть в
> XP SP2.

Не знаю, что ты имел в виду, но в Win98 тоже самое:
0_0_1
0_01
001

2 Anatoly Podgoretsky ©   (15.03.06 13:08) [13]
Да какие базы. Простой парадокс.


Anatoly Podgoretsky   (2006-03-15 13:08:00) [2]

Германн ©   (15.03.06 02:17) [10]
Базы SQL это слишком расплывчато, например при использовании виндоуской сортировки в MS SQL будет именно так, как у тебя, а при использовании двоичной по кодам, есть еще куча сортировок.


Desdechado   (2006-03-15 12:37:00) [3]

Про подчеркивания я говорил. Эта фича AFAIR появиласть в XP SP2. Видимо, вместе с обработкой минуса.
Ради интереса, проверь как сортируются по именам файлы в каталоге на разных ОС, если в именах есть подчеркивание.
Кстати, Оракл сортирует тоже с игнорированием подчеркивания, например:
ВАЛЯ
В_АНЯ
ВАСЯ


clickmaker   (2006-03-15 09:48:00) [4]


> Германн ©   (15.03.06 02:17) [10]

ну так сортируй строки в чеклистбоксе сам, используя CompareString... в чем проблема-то?


Германн   (2006-03-15 02:17:00) [5]

Я соб-сно почему в это дело влез. В одной конторе, где работал наш программно-аппаратный комплекс, сдох компьютер. Ребята из фирмы, которая обслуживает этот объект, заменили компьютер, установили на нём ОС и нашу программу. Скопировали на него базу данных из "резервной копии". Всё вроде бы заработало, но посыпались жалобы от пользователей, что "раньше у нас было по-другому". Ребята из той фирмы сами не справились, их директор попросил моего директора помощи. Приехал я туда. Исправил что мог, но вот в этом вопросе - сдался. Есть в программе два окна. Первое содержит полный список неких объектов, получаемый из базы данных SQL-запросом с "ORDER BY NameOfObject" и там сортировка привычная всем со времён ДОСа. Второе - TCheckListBox, в котором содержится динамически изменяющееся подмножество того самого полного списка. И сразу претензии: Почему в одном списе последовательность одна, а в другом другая? А вот раньше, до сбоя, оба списка были однотипные!


Германн   (2006-03-15 01:52:00) [6]


> begin...end ©   (14.03.06 18:50) [5]

Спасибо! Прочитал. Отправил юзерам письмо с рекомендациями как им поступить, чтобы сделать то, что они хотят.
Только вот плохо, что в данной статье в примере различия между "сортировкой по словам" и "сортировкой по строками" не приведен вариант сравнения, например tantи t-ant. Поскольку смысл строки in order to ensure that words such as "coop" and "co-op" stay together within a sorted list.лично мне, не вполне ясен.

Дальнейшие мои копания в данной области привели к ещё одному феномену: строка 0_01 в списке стоит выше строки 001, хотя у неё второй симол имеет Ord = $5f ! А в вышеприведённой статье говорится толькоо необычной трактовке "тире" и "апострофа". :((( Это проверял только в ХР.


clickmaker   (2006-03-14 19:20:00) [7]


> begin...end ©   (14.03.06 19:16) [7]

сильно подозреваю, что виндозные контролы тоже юзают эту функцию. Иначе MS можно заподозрить в жульничестве :)


begin...end   (2006-03-14 19:16:00) [8]

> clickmaker ©   (14.03.06 19:00) [6]

В VCL ListBox (CheckListBox) и ComboBox не занимаются сортировкой и не юзают CompareString. Вместо этого они устанавливают/сбрасывают стили контролов -- LBS_SORT и CBS_SORT.


clickmaker   (2006-03-14 19:00:00) [9]


> Германн ©   (14.03.06 18:36) [4]

VCL юзает апишную функцию CompareString, а она трактует дефис как часть слова, т.е. слова goto и go-to у тебя будут идти друг за другом.
Для включения "чисто строковой" сортировки ей нужно подсунуть флажок SORT_STRINGSORT


begin...end   (2006-03-14 18:50:00) [10]

Читать http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/strings/stringreference/stringfunctions/comparestring.asp(Remarks).


Германн   (2006-03-14 18:36:00) [11]


> Desdechado ©   (14.03.06 18:30) [3]
>
> а сортировка-то включена?
> и есть еще способы сортировки, учитывающие длину строк (некоторые
> СУБД так делают)
> а также есть сортировки, которые игнорируют знаки подчеркивания
> (про минус не скажу)
> а минус ли это вообще?
>

Сортировка включена. Длина строк не учитывается (0011 тоже выше 0-01). Это действительно минус (именно $2d). Проверено в TListBox, TComboBox, TCheckListBox и TRxCheckListBox).


Desdechado   (2006-03-14 18:30:00) [12]

а сортировка-то включена?
и есть еще способы сортировки, учитывающие длину строк (некоторые СУБД так делают)
а также есть сортировки, которые игнорируют знаки подчеркивания (про минус не скажу)
а минус ли это вообще?


Германн   (2006-03-14 18:18:00) [13]


> Desdechado ©   (14.03.06 18:11) [1]
>
> строки сортируются по правилам для строк - больше код символа,
>  дальше стоит


По твоему $2d больше $30 ?


Desdechado   (2006-03-14 18:11:00) [14]

строки сортируются по правилам для строк - больше код символа, дальше стоит


Наверх

Титульная страница Поиск, карта сайта Написать письмо