procedure _QuickSort(AHandle:THandle;TL:TList;Index:integer;SortStyle:TCustomSortStyle;SortOrder:boolean);
var
S1, S2 : string;
I1,I2 : int64;
B1,B2 : boolean;
procedure QSort(L,R,Typ:integer;Liste:TList);
var
I,J,M :longInt;
function Verg(P1,P2:integer):shortint;
begin
result := 0;
case SortStyle of
cssAlphaNum : begin
case Index of //Ist die Spalten aus dem z.B.ListViev
1 : begin
S1 := AnsiLowerCase(PDateiListRec(Liste[P1])^._FileName);
S2 := AnsiLowerCase(PDateiListRec(Liste[P2])^._FileName);
end;
2 : begin
S1 := AnsiLowerCase(PDateiListRec(Liste[P1])^._Erw0);
S2 := AnsiLowerCase(PDateiListRec(Liste[P2])^._Erw0);
end;
end;//case Index
if not SortOrder then
begin
if S1 > S2 then result := 1;
if S1 < S2 then result := -1;
end else begin
if S1 > S2 then result := -1;
if S1 < S2 then result := 1;
end;
end;//cssAlphaNum
cssNumeric : begin
case Index of //Ist die Spalten aus dem z.B.ListViev
3 : begin
I1 := PDateiListRec(Liste[P1])^._Size;
I2 := PDateiListRec(Liste[P2])^._Size;
end;
4 : begin
I1 := PDateiListRec(Liste[P1])^._CRC64Calc;
I2 := PDateiListRec(Liste[P2])^._CRC64Calc;
end;
end;//case Index
if not SortOrder then
begin
if I1 > I2 then result := 1;
if I1 < I2 then result := -1;
end else begin
if I1 > I2 then result := -1;
if I1 < I2 then result := 1;
end;
end;//cssNumeric
cssBoolean : begin
case Index of
0 : begin//_Duplikat
B1 := PDateiListRec(Liste[P1])^._Duplikat;
B2 := PDateiListRec(Liste[P2])^._Duplikat;
I1 := PDateiListRec(Liste[P1])^._Size;
I2 := PDateiListRec(Liste[P2])^._Size;
end;
1 : begin
B1 := PDateiListRec(Liste[P1])^._DateiError;
B2 := PDateiListRec(Liste[P2])^._DateiError;
end;
2 : begin
B1 := PDateiListRec(Liste[P1])^._Geaendert;
B2 := PDateiListRec(Liste[P2])^._Geaendert;
end;
end;//case Index
if not SortOrder then
begin
if (B1 > B2) and (I1 > I2) then result := 1;
if (B1 < B2) and (I1 < I2) then result := -1;
end else begin
if (B1 > B2) and (I1 > I2) then result := -1;//um diese Stelle geht es
if (B1 < B2) and (I1 < I2) then result := 1; //um diese Stelle geht es
end;
end;//cssBoolean
end;//SortStyle
end;//Verg
begin//QSort;
try
repeat
I:=L;
J:=R;
M:=(L + R) shr 1;
repeat
while Verg(I,M) < 0 do inc(I);
while Verg(J,M) > 0 do
dec(J);
if I <= J then
begin
_PListSwap(Liste,I,J);
if I=M
then M:=J
else if J=M then M:=I;
inc(I);
dec(J);
end;
if GetAsyncKeystate(VK_ESCAPE) <> 0 then exit;
until I > J;
if L < J then QSort(L, J,Typ,Liste);
L := I;
until I >= R;
except
on E:
Exception do
begin
TS_ErrorLog.Add('_QuickSort');
TS_ErrorLog.Add(E.ClassName+':'+E.Message);
TS_ErrorLog.Add(RS_ErrorStrich);
end;
end;
end;
begin//_QuickSort
SendMessage(AHandle,WM_QSORT_BEGIN,0,13);
if TL.Count -1 < 0 then exit;
QSort(0,TL.Count-1,Index,TL);
SendMessage(AHandle,WM_QSORT_END,0,13);
end;