![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FileListBox1 - отсутствует сортировка [D7, WinXP]
kyn66 © (2009-01-30 12:39:00)Предположим в каталоге на диске лежат некоторые файлы, имеющие в составе имени упорядоченный список цифр, типа http://yurec66.narod.ru/Hlam/vop01.jpg(обратите внимание на сортировку в Total Commsnder). В программе считываю этот список для дальнейшей обработки в FileListBox http://yurec66.narod.ru/Hlam/vop1.jpg(обратите внимание на сортировку). В данном случае FileListBox отсортировал полученные данные на свое усмотрение. Однако, такая сортировка меня не устраивает. Мне нужно, чтобы 10 шло после 9-ти, а не после 1. В настройках FLB нет упоминания о сортировке. Как можно решить эту проблему, подскажите, уважаемые мастера.
kyn66 (2009-01-30 15:00:00) [1]Да, действительно, без дополнительного рукоприкладства не обошлось. Вопрос закрыт, всем спасибо!
clickmaker (2009-01-30 13:19:00) [2]StrCmpLogicalW(), как вариант
icWasya (2009-01-30 13:11:00) [3]а функция сравнения, например такая
const Digits=['0'..'9'];
function GoodStrComp(ps1,ps2:pchar):integer;
//0 если равны, <0 если s1<s2
var DigCnt:integer;
begin
//У первого символа нет предыдущего, так что обработаем отдельно.
result:=integer(ps1^)-byte(ps2^);
if (ps1^=#0) then exit;
if result<>0 then exit;
Inc(ps1);Inc(ps2);
while (ps1^=ps2^) and (ps1^<>#0) do
begin Inc(ps1);Inc(ps2) end;
//Нашли различие. Теперь ставим диагноз.
result:=integer(ps1^)-byte(ps2^);
if (ps1^=#0)or(ps2^=#0) then exit;
if ps1^ in Digits
then
if ps2^ in Digits
then //оба символа - цифры
begin //Считаем, у кого больше цифр осталось справа
DigCnt:=0;
while (ps1^ in Digits) do begin inc(DigCnt); inc(ps1) end;
while (ps2^ in Digits) do begin dec(DigCnt); inc(ps2) end;
if DigCnt<>0 then result:=DigCnt
end
else //ps1^=цифра, ps2^=буква (так что сейчас result<0)
if (ps1-1)^ in Digits then result:=1 else
else //ps1^=буква
if ps2^ in Digits
then //ps2^=цифра, так что пока result>0
if (ps1-1)^ in Digits then result:=-1 else;
end;
function GoodCompareStr(const s1,s2:String):integer;
begin
Result:=GoodStrComp(PChar(s1),PChar(s2));
end;
kyn66 (2009-01-30 13:10:00) [4]
> Тот же самый кастом сорт с приведенным к стринглисту айтемсом.
> только без устаревшего вин3.1 контрла флб
Очень обтекаемо и не совсем понятно
Медвежонок Пятачок (2009-01-30 13:02:00) [5]Тот же самый кастом сорт с приведенным к стринглисту айтемсом.
только без устаревшего вин3.1 контрла флб
kyn66 (2009-01-30 12:55:00) [6]
> Считывай в листбокс и сортируй как надо
Интересный вариант. Но как надо это как? ТАм есть только Sorted (True, False) и все. Но это не помогает, сортировка не меняется.
Сергей М. (2009-01-30 12:46:00) [7]TFileListBox имеет св-во Items: TStrings, которое м.б. приведено к TStringList для последующего вызова метода CustomSort
Медвежонок Пятачок (2009-01-30 12:45:00) [8]В программе считываю этот список для дальнейшей обработки в FileListBox
Считывай в листбокс и сортируй как надо