Форум: "Основная";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c