Ich gehe mal davon aus, ItemsInfo ist dein "array of record", welches sortiert werden soll. Oder?
Wo wird denn Itemsinfo gefüllt? Wo und wie ist ItemsInfo deklariert?
Delphi-Quellcode:
TItemsInfo = record
Item: Integer;
SubItem: Integer;
ImgIcon: HICON;
Extension: WideString;
Path: WideString;
Width: Integer;
Height: Integer;
IdentStr: WideString;
end;
TSkinListView = class(TInterfacedPersistent, ISkinListView)
private
ItemsInfo: array of TItemsInfo;
//...
Delphi-Quellcode:
procedure TSkinListView.SetItemIcon(nItem, nSubItem: Integer;
ImgIdent: WideString; ImgPath: WideString);
var
lpImg: LONG_PTR;
hbmReturn: HBitmap;
ii: ICONINFO;
hbmMask: HBitmap;
bw, bh: single;
begin
if ImgPath <> '' then
begin
if FileExists(ImgPath) then
begin
if GdipLoadImageFromFile(PWideChar(ImgPath), lpImg) = OK then
begin
GdipCreateHBITMAPFromBitmap(lpImg, hbmReturn, 0);
if hbmReturn <> 0 then
begin
GdiPGetImageDimension(lpImg, bw, bh);
hbmMask := CreateCompatibleBitmap(GetDC(0),
round(bw), round(bh));
ii.fIcon := TRUE;
ii.hbmColor := hbmReturn;
ii.hbmMask := hbmMask;
hic := CreateIconIndirect(ii);
DeleteObject(hbmMask);
DeleteObject(hbmReturn);
end;
end;
end;
end;
SetLength(ItemsInfo, nItem + 1);
ItemsInfo[nItem].Item := nItem;
ItemsInfo[nItem].SubItem := nSubItem;
ItemsInfo[nItem].Width := round(bw);
ItemsInfo[nItem].Height := round(bh);
ItemsInfo[nItem].ImgIcon := hic;
ItemsInfo[nItem].IdentStr := ImgIdent;
end;
Ich sortiere die Liste
ListView_SortItems(hListView, @CompareFunc, ColumnIndex); // Liste wird sortiert
und fülle eine StringList mit den Aktuellen Daten so wie sie sortiert wurden.
Alphabetisch positiv und negativ abhängig von der Sortier Richtung.
Nun muss ich das Array of record ItemsInfo so sortieren das der IdentStr gleich ist den Index der StringList.
Wenn ich das nicht tue werden die Icons an falscher Position gezeichnet.
ItemsInfo[J] müsste dann gleich sein wie der Index der Stringlist der so verglichen wird
if StringList[j] > ItemsInfo[j].IdentStr then