Einzelnen Beitrag anzeigen

venice2
(Gast)

n/a Beiträge
 
#6

AW: array of record sortieren

  Alt 7. Dez 2020, 18:09
Deine Funktion gibt mir falsche werte zurück.

Delphi-Quellcode:
  PItemsInfo = ^TItemsInfo;
  TItemsInfo = record
    Item: Integer;
    SubItem: Integer;
    ImgIcon: HICON;
    Extension: WideString;
    Path: WideString;
    Width: Integer;
    Height: Integer;
    IdentStr: WideString;
  end;
Delphi-Quellcode:
  
type
  TArray = array of TItemsInfo;
Delphi-Quellcode:
procedure TSkinListView.Swap(var Data1, Data2: TItemsInfo);
var
  Temp : TItemsInfo;
begin
  Temp := Data1;
  Data1 := Data2;
  Data2 := Temp;
end;

function TSkinListView.Compare(const Data1, Data2: TItemsInfo): Integer;
begin
  Result := CompareText(Data1.IdentStr, Data2.IdentStr);
end;

procedure TSkinListView.SortArray(var ItemsInfo: TArray);
var
  Index : Integer;
  Laenge : Integer;
  Swapped : Boolean;
begin
  Laenge := Length(ItemsInfo);
    repeat
      Swapped := False;
        for Index := 1 to Laenge - 1 do
          begin
            if Compare(ItemsInfo[Index - 1], ItemsInfo[Index]) > 0 then
              begin
                Swap(ItemsInfo[Index - 1], ItemsInfo[Index]);
                Swapped := True;
              end;
          end;
      Dec(Laenge);
    until not Swapped;
end;
Delphi-Quellcode:
var
  ItemsArray: TArray;

begin
  ItemCount := ListView_GetItemCount(hListView);
  SetLength(ItemsArray, ItemCount);

  i := 0;
  while i <= ItemCount - 1 do
  begin
    ItemsArray[i].IdentStr := ItemsInfo[i].IdentStr;
    ItemsArray[i].Item := ItemsInfo[i].Item;
    ItemsArray[i].SubItem := ItemsInfo[i].SubItem;
    ItemsArray[i].ImgIcon := ItemsInfo[i].ImgIcon;
    ItemsArray[i].Extension := ItemsInfo[i].Extension;
    ItemsArray[i].Path := ItemsInfo[i].Path;
    ItemsArray[i].Width := ItemsInfo[i].Width;
    ItemsArray[i].Height := ItemsInfo[i].Height;
    Inc(i);
  end;

  SortArray(ItemsArray);

EDIT:
Das hier
if Compare(ItemsInfo[Index - 1], ItemsInfo[Index]) > 0 then
Nicht jeder Eintrag hat ein Icon und wenn kein Icon existiert ist der IdentStr leer.

muss zu
Compare(ItemsInfo[Index - 1], ItemsInfo[Index]);
geändert werden damit alles mitgenommen wird nicht nur die Strings.

Hmm.. geht nur wenn ich numeric sortiere nicht mit string.
https://im-coder.com/sortieren-von-a...habetisch.html

Danke.

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