2011-02-27 10 views
17

Recapitulación:¿Cómo obtener el orden de Delphi como en el Explorador de Windows?

  1. La terminología que he estado buscando parece ser " tipo natural".
  2. Para comportamientos en los sistemas operativos:

    • para Windows (versión> = XP), el Explorador de Windows utiliza naturales tipo.
    • Para terminales Linux: utilice "ls -v" en lugar de "ls" simple para obtener el tipo natural .
  3. Para programar en Delphi, use la API de Windows StrCmpLogicalW para ordenar de forma natural.

  4. para la programación en Delphi & Kylix & Lázaro, utilizan las funciones hechas a mano para conseguir tipo natural:

================ ==========

Los siguientes nombres de archivo se ordenará en el Explorador de Windows como se muestra a continuación:

test_1_test.txt

test_2_test.txt

test_11_test.txt

test_12_test.txt

test_21_test.txt

test_22_test.txt

Si, por ejemplo, los puse en una instancia TStringList y llamar a clasificar, el orden de clasificación es la siguiente:

test_1_test.txt

test_11_test.txt

test_12_test.txt

test_2_test .txt

test_21_test.txt

test_22_test.txt

Y para el registro, los nombres de los archivos anteriores se ordenarán en la terminal rxvt de Cygwin o terminal xterm de las distribuciones de Linux como CentOS como se muestra a continuación:

test_11_test.txt

test_12_test.txt

test_1_test.txt

test_21_test.txt

test_22_test.txt

test_2_test.txt

Podría ayudar a explicar cómo se puede entender esta diferencia de clasificar los comportamientos? Además, ¿es posible obtener el mismo orden que en Windows Explorer? ¡Cualquier sugerencia es apreciada!

PD: Mi configuración regional de Windows está configurada en chino, pero creo que sería lo mismo para la configuración en inglés.

+2

ver http://stackoverflow.com/questions/2175066/how-can-i-get-tstringlist- to-sort-differently-in-delphi –

+1

Me he dado cuenta de esto antes. AFAICS, las versiones de Windows más recientes reconocen el número dentro del nombre de archivo y clasifican los números como números y no como texto. –

+0

@ax: ¡Muchas gracias por la información! ¡Lo leeré ahora! – SOUser

Respuesta

21

StrCmpLogicalW es capaz de manejar los números, la otra alternativa es CompareString

+0

¡Muchas gracias por su sugerencia! – SOUser

+0

¿Podría ayudarnos a comentar cuál es la mejor práctica para lograr la misma función en Kylix (aplicación compilada por Kylix que se ejecuta en Linux)? – SOUser

+0

@Xichen Li: si linux/posix no tiene una función similar, tendría que escribir la suya ... – Anders

14

Gracias a Anders - la respuesta es StrCmpLogicalW; No he encontrado que la declaración en Delphi 2009 fuentes, por lo que declaró que a mí mismo en la prueba a continuación:

type 
    TMyStringList = class(TStringList) 
    protected 
    function CompareStrings(const S1, S2: string): Integer; override; 
    end; 

function StrCmpLogicalW(P1, P2: PWideChar): Integer; stdcall; external 'Shlwapi.dll'; 

function TMyStringList.CompareStrings(const S1, S2: string): Integer; 
begin 
    Result:= StrCmpLogicalW(PChar(S1), PChar(S2)); 
end; 

procedure TForm11.Button2Click(Sender: TObject); 
var 
    SL: TMyStringList; 

begin 
    SL:= TMyStringList.Create; 
    try 
    SL.Add('test_1_test.txt'); 
    SL.Add('test_11_test.txt'); 
    SL.Add('test_12_test.txt'); 
    SL.Add('test_2_test.txt'); 
    SL.Add('test_21_test.txt'); 
    SL.Add('test_22_test.txt'); 
    SL.Sort; 
    Memo1.Lines:= SL; 
    finally 
    SL.Free; 
    end; 
end; 
+0

¡Muchas gracias por su tiempo y amable ayuda! ¡Tu código de muestra es muy útil! – SOUser

+0

+1 excelente publicación –

+1

[Error] Test.pas (264): Tipos incompatibles: 'Char' y 'WideChar'. ¿Cómo arreglarlo (D7)? – NGLN

Cuestiones relacionadas