![]() |
(nonVcl) ListView Sortieren ein durcheinander
Ich verwende die ListView Sortierfunktion aus dem ListView Sample von Luckie
Zitat:
Delphi-Quellcode:
Beim addieren der Items weise ich das Flag LVIF_PARAM zu.
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;
Delphi-Quellcode:
ohne dieses Flag sind (lp1, lp2) immer 0.
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; 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 |
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.
|
AW: (nonVcl) ListView Sortieren ein durcheinander
Zitat:
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:
ArrowOffset ist für das SortIcon welches Bild im Strip gezeichnet werden soll.
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;
Delphi-Quellcode:
und dann den Code weiter oben.
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; Verstehe nicht warum lp1 und lp2 so ein Problem verursachen. gruss gruss |
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:
Meins!
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;
Delphi-Quellcode:
Sag mir nun wo hier der Unterschied ist ;)
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; 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 |
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-)
|
AW: (nonVcl) ListView Sortieren ein durcheinander
Zitat:
Ich mache ja vieles selber aber man muss das Rad ja nicht neu erfinden. Und die Sortierung ist verdammt schnell. gruss |
AW: (nonVcl) ListView Sortieren ein durcheinander
Darf man bitte erfahren, wo das ListView-Sample sich befindet?
|
AW: (nonVcl) ListView Sortieren ein durcheinander
![]() |
AW: (nonVcl) ListView Sortieren ein durcheinander
Ich danke Dir!
|
AW: (nonVcl) ListView Sortieren ein durcheinander
Zitat:
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz