![]() |
Problem mit CustomSort in Listview
Hallo Leute,
ich habe ein kleines Problem: Ich möchte eine Aufgabenverwaltung für mehrere Benutzer schreiben. Diese Aufgaben sollen auch auf einer Übersicht Sortiert nach benutzer und Priorität sortiert werden. Ich habe mir für die Listview eine Sortierroutine geschrieben die aber nicht so arbeitet wie ich das gerne hätte und ich weis ncith wieso:-( Die Routine:
Delphi-Quellcode:
Der Aufruf:
function AuswertungSortProc(Item1, Item2: TListItem; Data: Integer): Integer; stdcall;
var prio1,prio2:integer; begin if Item1.Caption <> Item2.Caption then Result:=CompareText(Item1.Caption,Item2.Caption) else begin prio1:=strtoint(item1.SubItems[0]); prio2:=strtoint(item2.SubItems[0]); result:=prio2-prio1; end; if data = 1 then Result := -Result; end;
Delphi-Quellcode:
Das Ergebnis sieht dann so aus:
ListView1.CustomSort(@AuswertungSortProc, 0);
aufg := Listview1.Items.Add; aufg.Caption:=user; aufg.SubItems.Add(prio); aufg.SubItems.Add(text); Benutzer | Prio | Text user1 | 1200 | aufgabe abce... user1 | 200 | aufgabe 123 user1 | 100 | aufgabe 345 user2 | 120 | aufgebe 876 user1 | 200 | aufgabe cde sollte aber so aussehen: Benutzer | Prio | Text user1 | 1200 | aufgabe abce... user1 | 200 | aufgabe 123 user1 | 200 | aufgabe cde user1 | 100 | aufgabe 345 user2 | 120 | aufgebe 876 Kann mir jemand sagen was ich falsch mache?? Ich weis, dass es schon viele Beiträge zum sortieren gibt, aber irgendiwe finde ich da keine Lösung auf mein Problem:-( dank schon mal im vorraus -Kaiser |
Re: Problem mit CustomSort in Listview
Hi Kaiser1401,
ich hab deinen Code zwar nicht so genau gelesen (du mögest mir doch bitte verzeihen, kann mit fremdem Code meist wenig anfangen :) ) und bin auch nicht so vertraut mit TListView, aber ich würde sagen, sortier erstmal nur nach User und dann jeden User-Block für sich nach Priorität. Snuffi |
Re: Problem mit CustomSort in Listview
Delphi-Quellcode:
function ComparePrio(a,b:integer);
begin if a > b then result := 1 else if a = b then result := 0 else Result := -1; end; function AuswertungSortProc(Item1, Item2: TListItem; Data: Integer): Integer; stdcall; var prio1,prio2:integer; begin Result:=CompareText(Item1.Caption,Item2.Caption) if Result = 0 then Result := ComparePrio(strtoint(item1.SubItems[0]), strtoint(item2.SubItems[0])); // if data = 1 then Result := -Result; // das würde ich erst mal auskommentieren, sicher ist sicher end; |
Re: Problem mit CustomSort in Listview
Danke schonmal. Werd es nachher mal ausprobieren.
|
Re: Problem mit CustomSort in Listview
Das mit Deinem Aufruf ist doch falsch. Die Customsortmethode sortiert nur den Inhalt einer Listview. Du musst doch nach jedem 'Add' die Liste neu sortieren. Oder, wenn Du mehrere Items einfügen willst, am Ende des Einfügevorganges.
|
Re: Problem mit CustomSort in Listview
Mh, ich hab es jetzt mal mit dem source von shmia ausprobiert. das ergebnis ist zwar etwas anders, aber richtig ist es noch nciht.
@alzaimar: Auch wennn ich die CustomSort nach jedem Punkt den ich einfüge aufrufe bekomme ich kein richtiges Ergebnis. :-( hat noch jemand eine idee? weiß nämlich absolut nicht warum das so nicht funktioniert. |
Re: Problem mit CustomSort in Listview
Zitat:
Zitat:
|
Re: Problem mit CustomSort in Listview
Zitat:
Ich habe es mal versucht jeweils eine sortierung im source auszuommentieren. => Sortierung nur nach user funktioniert einwandfrei => Sortierung nur nach prio funktioniert einwandfrei Aber warum klappt das nicht zusammen :? |
Re: Problem mit CustomSort in Listview
Mach es so:
Schreibe ein Beispielprojekt, das nicht so funktioniert, wie Du es Dir vorstellst und poste das hier. Dann finden wir den Fehler. Garantiert. |
Re: Problem mit CustomSort in Listview
Die Sortierung müsste so aussehen:
Delphi-Quellcode:
function AuswertungSortProc(Item1, Item2: TListItem; Data: Integer): Integer; stdcall;
var prio1,prio2:integer; var res: Integer; begin res := CompareText(Item1.Caption,Item2.Caption) if (res = 0) and (ComparePrio(strtoint(item1.SubItems[0]), strtoint(item2.SubItems[0]) > 0) then Result := ComparePrio(strtoint(item1.SubItems[0]), strtoint(item2.SubItems[0])) else Result := res; end; |
Re: Problem mit CustomSort in Listview
Sehr geehrter Herr Kaiser,
also bei mir funktionierts....
Delphi-Quellcode:
Nach user aufsteigend, nach Prio absteigend. Wo ist jetzt Dein Problem?
Function AuswertungSortProc(Item1, Item2: TListItem; Data: Integer): Integer; stdcall;
Var prio1, prio2: integer; Begin If Item1.Caption <> Item2.Caption Then Result := CompareText(Item1.Caption, Item2.Caption) Else Begin prio1 := strtoint(item1.SubItems[0]); prio2 := strtoint(item2.SubItems[0]); result := prio2 - prio1; End; If data = 1 Then Result := -Result; End; Procedure TForm1.btClick(Sender: TObject); Procedure _Add(aUser, aprio, aAufgabe: String); Begin With lvTest.Items.Add Do Begin Caption := aUser; SubItems.Add(aPrio); SubItems.Add(aAufgabe); End; End; Begin _Add('user2', '120', 'aufgebe 876'); _Add('user1', '1200', 'aufgabe abce...'); _Add('user1', '200', 'aufgabe 123'); _Add('user1', '100', 'aufgabe 345'); _Add('user1', '200', 'aufgabe cde'); lvTest.CustomSort(@AuswertungSortProc, 0); End; [edit] Code verhübscht [/edit] |
Re: Problem mit CustomSort in Listview
siht eigentlich nciht viel anders aus als bei mir würd ich sagen.
Ich hab hier mal einen beispiel source der nciht das tut was er soll:
Delphi-Quellcode:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls; type TForm1 = class(TForm) ListView1: TListView; Button1: TButton; procedure Button1Click(Sender: TObject); private function ComparePrio(a,b:integer):integer; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var aufg : TListItem; function AuswertungSortProc(Item1, Item2: TListItem; Data: Integer): Integer; stdcall; var prio1,prio2:integer; begin Result:=CompareText(Item1.Caption,Item2.Caption); result:= 0; if Result = 0 then prio1:=strtoint(item1.SubItems[0]); prio2:=strtoint(item2.SubItems[0]); Result := -Form1.ComparePrio(prio1,prio2); //if data = 1 then Result := -Result; end; begin // Das hier ist eigentlich eine schleife, aber im Beispiel schreibe ich es mal hard rein: ListView1.CustomSort(@AuswertungSortProc, 0); aufg := Listview1.Items.Add; aufg.Caption:='user1'; aufg.SubItems.Add('200'); aufg.SubItems.Add('text1234'); ListView1.Refresh; // Schleifenende ListView1.CustomSort(@AuswertungSortProc, 0); aufg := Listview1.Items.Add; aufg.Caption:='user1'; aufg.SubItems.Add('1200'); aufg.SubItems.Add('text1234'); ListView1.Refresh; ListView1.CustomSort(@AuswertungSortProc, 0); aufg := Listview1.Items.Add; aufg.Caption:='user1'; aufg.SubItems.Add('100'); aufg.SubItems.Add('text1234'); ListView1.Refresh; ListView1.CustomSort(@AuswertungSortProc, 0); aufg := Listview1.Items.Add; aufg.Caption:='user2'; aufg.SubItems.Add('120'); aufg.SubItems.Add('text1234'); ListView1.Refresh; ListView1.CustomSort(@AuswertungSortProc, 0); aufg := Listview1.Items.Add; aufg.Caption:='user1'; aufg.SubItems.Add('200'); aufg.SubItems.Add('text1234'); ListView1.Refresh; end; function TForm1.ComparePrio(a,b:integer):integer; begin if a > b then result := 1 else if a = b then result := 0 else Result := -1; end; end. |
Re: Problem mit CustomSort in Listview
Hallo,
schau Dir mal Zeile 35 an. Dann schmeiss diese weg. Gruß xaromz |
Re: Problem mit CustomSort in Listview
sorry, hatte ich vergessen wieder rauszunehmen, funktioniert aber immer noch nicht:
user2 | 120 user1 | 1200 user1 | 200 user1 | 100 user1 | 200 werd aber mal eben das von Luckie ausprobieren. hatte ich grade nicht gesehen :oops: |
Re: Problem mit CustomSort in Listview
*freu* :-D Das von Luckie hat funktioniert. Dank euch allen für die bemühungen.
bis dann Kaiser |
Re: Problem mit CustomSort in Listview
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:38 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