Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.17;
Скачать: CL | DM;

Вниз

FileListBox1 - отсутствует сортировка   Найти похожие ветки 

 
kyn66 ©   (2009-01-30 12:39) [0]

Предположим в каталоге на диске лежат некоторые файлы, имеющие в составе имени упорядоченный список цифр, типа http://yurec66.narod.ru/Hlam/vop01.jpg (обратите внимание на сортировку в Total Commsnder). В программе считываю этот список для дальнейшей обработки в FileListBox http://yurec66.narod.ru/Hlam/vop1.jpg (обратите внимание на сортировку). В данном случае FileListBox отсортировал полученные данные на свое усмотрение. Однако, такая сортировка меня не устраивает. Мне нужно, чтобы 10 шло после 9-ти, а не после 1. В настройках FLB нет упоминания о сортировке. Как можно решить эту проблему, подскажите, уважаемые мастера.


 
Медвежонок Пятачок ©   (2009-01-30 12:45) [1]

В программе считываю этот список для дальнейшей обработки в FileListBox

Считывай в листбокс и сортируй как надо


 
Сергей М. ©   (2009-01-30 12:46) [2]

TFileListBox имеет св-во Items: TStrings, которое м.б. приведено к TStringList для последующего вызова метода CustomSort


 
kyn66 ©   (2009-01-30 12:55) [3]


> Считывай в листбокс и сортируй как надо

Интересный вариант. Но как надо это как? ТАм есть только Sorted (True, False) и все. Но это не помогает, сортировка не меняется.


 
Медвежонок Пятачок ©   (2009-01-30 13:02) [4]

Тот же самый кастом сорт с приведенным к стринглисту айтемсом.
только без устаревшего вин3.1 контрла флб


 
kyn66 ©   (2009-01-30 13:10) [5]


> Тот же самый кастом сорт с приведенным к стринглисту айтемсом.
> только без устаревшего вин3.1 контрла флб

Очень обтекаемо и не совсем понятно


 
icWasya ©   (2009-01-30 13:11) [6]

а функция сравнения, например такая
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;


 
clickmaker ©   (2009-01-30 13:19) [7]

StrCmpLogicalW(), как вариант


 
kyn66 ©   (2009-01-30 15:00) [8]

Да, действительно, без дополнительного рукоприкладства не обошлось. Вопрос закрыт, всем спасибо!



Страницы: 1 вся ветка

Текущий архив: 2010.01.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
15-1258068949
Германн
2009-11-13 02:35
2010.01.17
Перевод с ... на всемирный


15-1258624428
Сергей
2009-11-19 12:53
2010.01.17
Система управления версиями для delphi.


2-1258818660
Wito
2009-11-21 18:51
2010.01.17
Рекурсивный обход дерева


15-1258463255
И. Павел
2009-11-17 16:07
2010.01.17
Java Script: Вставка текста при нажатии кнопки


2-1259348366
serhiyiv
2009-11-27 21:59
2010.01.17
ListView