Zitat:
Die CompareFunc-Funktion allein kann m.E. nicht sortieren,
Wie kann nicht. (Alleine nicht aber ohne geht's auch nicht)
Klar kann sie das Strings und Integer werte.
Ist erweiterbar aber mir reichst.
Habe das für meine Zwecke noch abgeändert um unabhängig von irgendwelchen ID's bzw.. SubItems zu sein.
TSortType = (sortInt = 1, sortString = 2);
Delphi-Quellcode:
PColumnInfo = ^TColumnInfo;
TColumnInfo = record
SortType: TSortType;
end;
ColumnInfo: array of TColumnInfo;
Delphi-Quellcode:
function CompareFunc(lp1, lp2, SubItem: LPARAM): integer; stdcall;
var
buf1,
buf2 : WideString;
a,
b : integer;
begin
SetLength(buf1, MAX_PATH);
ZeroMemory(@buf1[1], MAX_PATH);
SetLength(buf2, MAX_PATH);
ZeroMemory(@buf2[2], MAX_PATH);
ListView_GetItemText(LVHandle, lp1, SubItem, @buf1[1], MAX_PATH);
ListView_GetItemText(LVHandle, lp2, SubItem, @buf2[1], MAX_PATH);
case ColumnInfo[SubItem].SortType of
// Dateigröße
sortInt:
begin
// alles nach dem Leerzeichen entfernen (z.B. "12345 B")
if(pos(#32, buf1) > 0) then
delete(buf1, pos(#32,buf1), length(buf1));
if(pos(#32, buf2) > 0) then
delete(buf2, pos(#32, buf2), length(buf2));
if UpDown then
begin
b := StrToIntDef(buf1, 0);
a := StrToIntDef(buf2, 0);
end else
begin
a := StrToIntDef(buf1, 0);
b := StrToIntDef(buf2, 0);
end;
if(a > b) then
Result := 1
else if(a < b) then
Result := -1
else
Result := 0;
end
// Name oder Typ
else begin
if UpDown then
Result := lstrcmpi(@buf2[1], @buf1[1])
else
Result := lstrcmpi(@buf1[1], @buf2[1]);
end;
end;
end;
Aufgerufen wird es dann so.
Delphi-Quellcode:
LVPlayList.InsertColumn(LVPlayList.Handle, 0, 'Nr.', 50, False, sortInt);
LVPlayList.InsertColumn(LVPlayList.Handle, 1, 'Time', 55, False, sortString);
So kann man jeder Spalte zuweisen wie sie Sortiert werden soll.
False steht für das Icon ob es angezeigt werden soll beim Start oder nicht.
gruss