Einzelnen Beitrag anzeigen

venice2
(Gast)

n/a Beiträge
 
#3

AW: array of record sortieren

  Alt 7. Dez 2020, 16:44
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

Geändert von venice2 ( 7. Dez 2020 um 16:57 Uhr)
  Mit Zitat antworten Zitat