Problem z sortowaniem

0

Witam!
Czy ktoś wie w jaki sposób posortować/ustawić w kolejności pliki, tak jak pokazuje explorator? Używam FindFirst i AnsiCompareStr, co niestety nie daje efektu.

0

Czy ktoś wie w jaki sposób posortować/ustawić w kolejności pliki, tak jak pokazuje explorator?

Gdzie ustawić ? Jak pokazuje ?

0

W ListBoxie masz metode Sort, drugi sposob to pobrac liste plikow do tablicy i uzyc ktorejs z metod sortowania na tej tablicy, np. babelkowe albo szybkie - wybor masz wielki.

0

Korzystając z QuickSorta musze podać funkcje, która dla danego porównania
przyjmie > 0, < 0 lub = 0 (w BubbleSort tak samo). Tak więc AnsiCompareStr,
CompareStr itp.

Sortowanie ListBoxa bazuje na wyżej wymienionych.

Przykładowe sortowanie AnsiCompareStr :

0011f
005d
006x
009c
01_lg
011x
014d
01s
03
05g
11r
14
16g
18

Explorer pokaże :

01_lg
01s
03
005d
05g
006x
009c
0011f
11r
011x
14
014d
16g
18

Wiem, że problem jest gówniany i nie ma co zaprzątać sobie głowy, ale pytam
bo być może ktoś zna odpowiedź.

0

Zależy jaką stronę kodową używasz przy sortowaniu. W Windowsie standard to WIN1250.

0

GetACP pokazuje 1250

0

jaką stronę kodową ? co wy gadacie ? napisz swoją funkcję AnsiCompareStr i tyle, znak po znaku leć i porównuj, ja mam w jednym z programów zastosowany QuickSort połączony właśnie z własną funkcją porównywania - lecisz znak po znaku ciągów i porównujesz - kodu nie udostępnie bo po pierwsze musiałbym poszukać go, po drugie za bardzo to jest zintegrowane z resztą programu, po trzecie pomyśl sobie samemu, a po czwarte to nie mam zwyczaju udostępniać niczego nad czym poświęciłem więcej niż 10 min czasu ;P

a co znaczy explorer pokaże - z której strony tak pokaże ? coś ty mu dał że ci tak pokazuje ?

0

No bo jak sortujesz według typów to może inaczej pokazać niż gdy wg. nazw...

0

Sprawa prosta ;) Jeżeli sortujesz np. według rozmiarów, a rozmiary są te same to porównujesz np. nazwy. Jeżeli nazwy są te same to wtedy typy itd. Oczywiście mówię tu o dwuargumentowej funkcji porównującej.

0

Nie wiem, może ja coś źle robię albo mój Windows (XP + Service Crack 2) jest jakiś dziwny. Eksplorator te pliki pokazuje tak.

Adamo, ja chciałem napisać funkcję bazującą na CompareStr, ale to :

function CompareStr(const S1, S2: string): Integer; assembler;
asm
        PUSH    ESI
        PUSH    EDI
        MOV     ESI,EAX
        MOV     EDI,EDX
        OR      EAX,EAX
        JE      @@1
        MOV     EAX,[EAX-4]
@@1:    OR      EDX,EDX
        JE      @@2
        MOV     EDX,[EDX-4]
@@2:    MOV     ECX,EAX
        CMP     ECX,EDX
        JBE     @@3
        MOV     ECX,EDX
@@3:    CMP     ECX,ECX
        REPE    CMPSB
        JE      @@4
        MOVZX   EAX,BYTE PTR [ESI-1]
        MOVZX   EDX,BYTE PTR [EDI-1]
@@4:    SUB     EAX,EDX
        POP     EDI
        POP     ESI
end;

jest dla mnie niezrozumiałe. Może mógłbyś coś podpowiedzieć, bo ord'ując myśle że wyjdzie coś innego. To nie jest tak, że mi sie nie chce pomyśleć. Nie marzyłem że ktoś odwali za mnie całą robotę i dostane gotowy kod, liczyłem raczej na poradę lub podpowiedź.

Nie trafiłem dokładnie z tym pytaniem bo nie mam problemu z sortowaniem jako takim, wiem jak używać QuickSorta (i nie tylko). Mogę połączyć go z AnsiCompareStr, AnsiCompareText, CompareStr itp, i uzyskać kolejność plików jak np WinRar. Ja chciałbym posegregować pliki w taki sposób jak to robi eksplorator.

0
fec napisał(a)

nie wiem, może ja coś źle robię albo mój Windows (XP + Service Crack 2) jest jakiś dziwny.

U mnie jest tak samo.

fec napisał(a)

Mogę połączyć go z AnsiCompareStr, AnsiCompareText, CompareStr itp, i uzyskać kolejność plików jak np WinRar. Ja chciałbym posegregować pliki w taki sposób jak to robi eksplorator.

Tak się zastanawiam po co udawać exploratora bo według mnie to te pliki nie są posortowane :D - jedyna różnica jest przy sortowaniu według daty. Normalnie to explorator używa funkcji sortującej CompareIDs udostępnionej przez interface IShellFolder. Z racji tego, że nie używasz tego interface'u użycie jej odpada ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1