Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   (nonVcl) ListView Sortieren ein durcheinander (https://www.delphipraxis.net/191852-nonvcl-listview-sortieren-ein-durcheinander.html)

EWeiss 24. Feb 2017 17:51


(nonVcl) ListView Sortieren ein durcheinander
 
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

Luckie 24. Feb 2017 18:03

AW: (nonVcl) ListView Sortieren ein durcheinander
 
Puih. Das ist schon lange her. hast du das Demo mal kompiliert und ausgeführt? Bei mir funktioniert das Demo wie es soll.

EWeiss 24. Feb 2017 18:12

AW: (nonVcl) ListView Sortieren ein durcheinander
 
Zitat:

Zitat von Luckie (Beitrag 1362587)
Puih. Das ist schon lange her. hast du das Demo mal kompiliert und ausgeführt? Bei mir funktioniert das Demo wie es soll.

Dein Demo funktioniert aber nicht die Umsetzung in meinem Programm.
Deshalb wundere ich mich warum es nicht geht.

Ich gehe genau so vor wie in deinem Sample abgesehen von den Zeichnungsroutinen und OwnerDraw...

Delphi-Quellcode:
procedure TSkinListView.SortItems(hListView: hWnd; ColumnIndex: Integer);
begin

  ListView_SortItems(hListView, @CompareFunc, ColumnIndex);
end;
Delphi-Quellcode:
            HDN_ITEMCLICKW, HDN_ITEMCLICKA:
              begin
                if pHDN.Button = 0 then
                begin
                  UpDown := not UpDown;
                  If UpDown then
                    ArrowOffset := 1
                  else
                  ArrowOffset := 2;

                  HeaderArrowCol := pHDN.Item;
                  GetClientRect(HeaderHandle, ClientRect);
                  InvalidateRect(HeaderHandle, ClientRect, True);

                  UpdateLParam(Handle);
                  SortItems(Handle, HeaderArrowCol);
                end;
              end;
ArrowOffset ist für das SortIcon welches Bild im Strip gezeichnet werden soll.
Delphi-Quellcode:
procedure TSkinListView.UpdateLParam(const hListView: HWND);
var
  lvi : TLVItem;
  i  : integer;
  ItemCount: Integer;
begin
  lvi.mask    := LVIF_PARAM;
  lvi.iSubItem := 0;

  ItemCount := ListView_GetItemCount(hListView);

  for i := 0 to ItemCount - 1 do
  begin
    lvi.iItem := i;
    lvi.lParam := i;
    SendMessage(ItemCount, LVM_SETITEM, 0, LPARAM(@lvi));
  end;
end;
und dann den Code weiter oben.
Verstehe nicht warum lp1 und lp2 so ein Problem verursachen.

gruss

gruss

EWeiss 24. Feb 2017 18:24

AW: (nonVcl) ListView Sortieren ein durcheinander
 
Argghhh.. Ich habs.
Aber keine Ahnung warum es bei dir trotzdem Funktioniert eigentlich dürfte es das nicht.

Deins!

Delphi-Quellcode:
procedure TSkinListView.UpdateLParam(const hListView: HWND);
var
  lvi : TLVItem;
  i  : integer;
  ItemCount: Integer;
begin
  lvi.mask    := LVIF_PARAM;
  lvi.iSubItem := 0;

  ItemCount := ListView_GetItemCount(hListView);

  for i := 0 to ItemCount - 1 do
  begin
    lvi.iItem := i;
    lvi.lParam := i;
    SendMessage(ItemCount, LVM_SETITEM, 0, LPARAM(@lvi));
  end;
end;
Meins!
Delphi-Quellcode:
procedure TSkinListView.UpdateLParam(const hListView: HWND);
var
  lvi : TLVItem;
  i  : integer;
  ItemCount: Integer;
begin
  lvi.mask    := LVIF_PARAM;
  lvi.iSubItem := 0;

  ItemCount := ListView_GetItemCount(hListView);

  for i := 0 to ItemCount - 1 do
  begin
    lvi.iItem := i;
    lvi.lParam := i;
    ListView_SetItem(hListView, lvi);
  end;
end;
Sag mir nun wo hier der Unterschied ist ;)

OK hier ist der Unterschied..
Delphi-Quellcode:
SendMessage(hListView, LVM_SETITEM, 0, Longint(@pItem));

Delphi-Quellcode:
SendMessage(ItemCount, LVM_SETITEM, 0, LPARAM(@lvi));


Ich habe beim addieren des ItemCount einen dicken Fisch addiert der dort nicht schwimmen durfte.
Wieder 2 Stunden unnötiger Ärger ... LOL

gruss

Luckie 24. Feb 2017 19:15

AW: (nonVcl) ListView Sortieren ein durcheinander
 
Und zu deiner PM. Natürlich darfst du es benutzen, sonst hätte ich es nicht online gestellt. Ein kleiner Vermerk im About-Dialog wäre nett und reicht vollkommen. 8-)

EWeiss 24. Feb 2017 19:21

AW: (nonVcl) ListView Sortieren ein durcheinander
 
Zitat:

Zitat von Luckie (Beitrag 1362600)
Und zu deiner PM. Natürlich darfst du es benutzen, sonst hätte ich es nicht online gestellt. Ein kleiner Vermerk im About-Dialog wäre nett und reicht vollkommen. 8-)

Wenn ich demnächst mal einen mache. Bitte kein Problem ;)
Ich mache ja vieles selber aber man muss das Rad ja nicht neu erfinden.
Und die Sortierung ist verdammt schnell.

gruss

Delphi-Laie 24. Feb 2017 23:02

AW: (nonVcl) ListView Sortieren ein durcheinander
 
Darf man bitte erfahren, wo das ListView-Sample sich befindet?

Luckie 24. Feb 2017 23:11

AW: (nonVcl) ListView Sortieren ein durcheinander
 
http://michael-puff.de/Programmierung/Delphi/Tutorials/ -> Win32API_Delphi_Demos.zip

Delphi-Laie 24. Feb 2017 23:13

AW: (nonVcl) ListView Sortieren ein durcheinander
 
Ich danke Dir!

Delphi-Laie 25. Feb 2017 12:05

AW: (nonVcl) ListView Sortieren ein durcheinander
 
Zitat:

Zitat von Luckie (Beitrag 1362611)

Nun, es war immer noch ein wenig Suche vonnöten, aber ich fand es.

Die Anzahl der Programme allein in dieser Deiner Archivdatei ist beeindruckend, Luckie! Wie schaffst Du das alles? Sind die Tage in Nordhessen länger?

Die CompareFunc-Funktion allein kann m.E. nicht sortieren, aber sie wird zweimal im Programm aufgerufen, man stößt letztlich auf Funktion "ListView_SortItems". Diese Sortierfunktion, deklariert in der Unit "Commctrl", also ein Borland-Produkt, verliert sich jedoch irgendwo in besagter Unit, ohne daß ihr eigentlicher Quellcode auftreiben wäre. Das wollte ich wissen, da ich wegen

Zitat:

Zitat von EWeiss (Beitrag 1362602)
Und die Sortierung ist verdammt schnell.

Blut geleckt habe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:39 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz