AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein (nonVcl) ListView Sortieren ein durcheinander
Thema durchsuchen
Ansicht
Themen-Optionen

(nonVcl) ListView Sortieren ein durcheinander

Ein Thema von EWeiss · begonnen am 24. Feb 2017 · letzter Beitrag vom 25. Feb 2017
Antwort Antwort
Seite 1 von 2  1 2      
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
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: (nonVcl) ListView Sortieren ein durcheinander

  Alt 24. Feb 2017, 18:03
Puih. Das ist schon lange her. hast du das Demo mal kompiliert und ausgeführt? Bei mir funktioniert das Demo wie es soll.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: (nonVcl) ListView Sortieren ein durcheinander

  Alt 24. Feb 2017, 18:12
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

Geändert von EWeiss (24. Feb 2017 um 18:16 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: (nonVcl) ListView Sortieren ein durcheinander

  Alt 24. Feb 2017, 18:24
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..
SendMessage(hListView, LVM_SETITEM, 0, Longint(@pItem));
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

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

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: (nonVcl) ListView Sortieren ein durcheinander

  Alt 24. Feb 2017, 19:15
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: (nonVcl) ListView Sortieren ein durcheinander

  Alt 24. Feb 2017, 19:21
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.
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
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: (nonVcl) ListView Sortieren ein durcheinander

  Alt 24. Feb 2017, 23:02
Darf man bitte erfahren, wo das ListView-Sample sich befindet?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: (nonVcl) ListView Sortieren ein durcheinander

  Alt 24. Feb 2017, 23:11
http://michael-puff.de/Programmierung/Delphi/Tutorials/ -> Win32API_Delphi_Demos.zip
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#9

AW: (nonVcl) ListView Sortieren ein durcheinander

  Alt 24. Feb 2017, 23:13
Ich danke Dir!
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#10

AW: (nonVcl) ListView Sortieren ein durcheinander

  Alt 25. Feb 2017, 12:05
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

Und die Sortierung ist verdammt schnell.
Blut geleckt habe.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 Uhr.
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