![]() |
AW: array of record sortieren
Kannst Du nicht TArray nehmen und dann "einfach" die Methode Sort verwenden?
|
AW: array of record sortieren
Zitat:
|
AW: array of record sortieren
Wenn die Sortierung sich ändert, könnte das dann nicht der IComparer behandeln?
![]() |
AW: array of record sortieren
Wenn in TItemsInfo auch die Informationen aller Spalten, nach denen sortiert werden kann, vorhanden ist, dann ja. Aber das ist aus den bisherigen Posts nicht ersichtlich.
|
AW: array of record sortieren
Zitat:
Hier nochmal meine Compare function die entsprechend sortiert.
Delphi-Quellcode:
type
TSortType = (sortInt = 1, sortString = 2, sortFloat = 3, sortDateTime = 4);
Delphi-Quellcode:
Mein Problem ist wie analysiere ich bzw. nach welchen Kriterium teile ich der Listbox mit das diese Row ein Icon enthält und
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 ColumnInfo[SubItem].SortType of // Dateigröße sortInt: 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; an dieser position gehalten werden muss. Die feste Einstellung also "1" muss mit ColumnIndex ersetzt werden. Wenn ich das nicht tue funktionieren nur die ListBoxen welche column 1 Strings zugewiesen haben. Wenn ich dann jedoch Column "0" klicke dann funktioniert es natürlich wieder nicht. Ich muss das Bild\Icon irgendwie fest an die entsprechend Row binden, habe da aber noch keine entsprechende Idee. Es geht nicht um den Comparer oder <TArray>, den Comparer habe ich ja durch meine Funktion schon (sortiert auf integer und string). Zitat:
Das macht..
Delphi-Quellcode:
ListView_SortItems(hListView, @CompareFunc, ColumnIndex); // Liste wird sortiert
Aber. Bei deiner Sortierung geht es nicht darum ob Alphabetisch oder nicht, sondern dafür zu sorgen das Icon an der richtigen Position zu bringen und das tut sie ja anhand des übergebenen Identifizierungsstring. Funktioniert "1a" wenn denn die richtige Column geklickt wurde. |
AW: array of record sortieren
Zitat:
|
AW: array of record sortieren
Zitat:
Die Sortierung ist aber Column(Spalten) abhängig. :) |
AW: array of record sortieren
Versuchte schon mehrmals vergeblich rauszufinden was Du willst.
Ich habe den Eindruck Du willst nicht ein "array of record sortieren" sondern Einträge in einem Litview. Ich bin dann raus. |
AW: array of record sortieren
Zitat:
Das array of record soll so sortiert werden das der Index des records passend ist zu dem der über
Delphi-Quellcode:
ListView_SortItems(hListView, @CompareFunc, ColumnIndex); // Liste wird sortiert
sortiert wurde. Ich habe jetzt mal versucht die Bilder fest an das ListView zu binden über eine Imageliste!
Delphi-Quellcode:
// Imageliste initialisieren
if hLarge = 0 then begin hLarge := ImageList_Create(round(bw), round(bh), ILC_COLOR32, 1, 1); // 32 Bit Bitmap konvertiert zu Icon ListView_SetImageList(Handle, hLarge, LVSIL_NORMAL); end; // Icon zur Liste addieren ImageList_AddIcon(hLarge, hIconItem); SetLength(ItemsInfo, nItem + 1); ItemsInfo[nItem].Item := nItem; ItemsInfo[nItem].SubItem := nSubItem; ItemsInfo[nItem].Width := round(bw); ItemsInfo[nItem].Height := round(bh); ItemsInfo[nItem].ImgIcon := hIconItem; ItemsInfo[nItem].IdentStr := ImgIdent; // Icon freigeben // wird nicht mehr verwendet da in der ImageList enthalten DestroyIcon(hIconItem);
Delphi-Quellcode:
aber nein. Die Bitmaps werden nicht an der korrekten Position gezeichnet bleiben einfach da wo sie sind nach dem sortieren.
if assigned(ItemsInfo) then
begin if (HeaderItem = ItemsInfo[Item].SubItem) and (ItemsInfo[Item].ImgIcon <> 0) then begin GetWindowRect(HeaderHandle, HeaderWindowRect); TmpRect := ClientRect; TmpRect.Left := ClientRect.Left + ItemsInfo[Item].Width; TmpRect.Top := ClientRect.Top + ((ItemHeight - FPointSize) div 2); HeaderItemRect.Left := (HeaderWindowRect.Left - LvWindowRect.Left) + (ClientRect.Left + HeaderItemRect.Left); if ImageList_Draw(hLarge, Item, hTempDC, HeaderItemRect.Left, (ClientRect.Top + 4), ILD_TRANSPARENT) then //DrawIconEx(hTempDC, HeaderItemRect.Left, (ClientRect.Top + 4), // ItemsInfo[Item].ImgIcon, ItemsInfo[Item].Width, // ItemsInfo[Item].Height, 0, 0, DI_NORMAL); DrawItem(WinHandle, hTempDC, Item, HeaderItem, TmpRect, ItemText, nSelected); end else //.. Warum? Das Problem ist hier das gleiche. Ich addiere Icons in der Reihenfolge. Die Reihenfolge richtet sich aber nicht nach dem Index der Zeile sondern wird hintereinander in die ImageListe addiert und schon habe ich wieder das Problem das der Index nicht passend zur Zeile ist. Bsp. ListRows 1,2,3,4,5 (3 Zeile hat kein Bild) ImageListe addiert 1,2,3,4 (3 Ist ja leer) also -1 Bild wenn ich nun zeichne werden die Rows mit Bildern belegt von 1 > 4 die 3 sollte eigentlich leer sein und die 5 Belegt. Wie will man das prüfen. grrr.... |
AW: array of record sortieren
Ok. Habe eine vorläufig Lösung.
Ich übergebe ja in SetItemIcon das SubItem wo ich die Bilder zeichne.
Delphi-Quellcode:
ItemsInfo[nItem].SubItem := nSubItem;
Das verwende ich nun für SortItems das.
Delphi-Quellcode:
zu
for i := 0 to ItemCount - 1 do
begin ZeroMemory(@buf, sizeof(buf)); ListView_GetItemText(hListView, i, 1, buf, sizeof(buf)); ItemText := buf; StringList.Add(ItemText); // Stringliste anhand der Sortierung erstellen. end;
Delphi-Quellcode:
gut ist
for i := 0 to ItemCount - 1 do
begin ZeroMemory(@buf, sizeof(buf)); ListView_GetItemText(hListView, i, ItemsInfo[i].SubItem, buf, sizeof(buf)); ItemText := buf; StringList.Add(ItemText); // Stringliste anhand der Sortierung erstellen. end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 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 by Thomas Breitkreuz