Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#1

(nonVcl) ListView Sortieren ein durcheinander

  Alt 24. Feb 2017, 17:51
Ich verwende die ListView Sortierfunktion aus dem ListView Sample von Luckie
Zitat:
// Sortierfunktion
// (Basis von NicoDE; modifziert von Mathias Simmack)
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 SubItem of
    // Dateigröße
    1:
      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;
Beim addieren der Items weise ich das Flag LVIF_PARAM zu.

Delphi-Quellcode:
procedure TSkinListView.InsertItem(hListView: hWnd; nItem: Integer; wsItems: WideString);
var
  lvItem: LV_ITEMW;
begin

  lvItem.mask := LVIF_TEXT or LVIF_PARAM;
  lvItem.iItem := nItem;
  lvItem.pszText := PWideChar(wsItems);
  lvItem.iSubItem := 0;
  ListView_InsertItem(hListView, lvItem);
end;
ohne dieses Flag sind (lp1, lp2) immer 0.

Die Sortierrichtung wird durch den UpDown Status geschaltet.

Normalerweise sollte die Funktion die Daten Alphabetisch sortieren tut sie aber nicht.
Da ist irgendwie alles Durcheinander und ich finde den Fehler nicht.

lp1 sollte eigentlich bei 0 beginnen und lp2 bei 1.
Der wert von lp1 ist aber 2 und der von lp2 irgend ein imaginärer wert bsp. 12345678
Die Sortierung ist dementsprechend total durcheinander.

Woher kommt dieser Fehler ?

Jemand ne Idee?
Wie man am Bild sehen kann alles durcheinander.

gruss

Geändert von EWeiss (11. Jul 2019 um 15:46 Uhr)
  Mit Zitat antworten Zitat