Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem mit CustomSort in Listview (https://www.delphipraxis.net/64645-problem-mit-customsort-listview.html)

kaiser1401 6. Mär 2006 15:29


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:
 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;
Der Aufruf:

Delphi-Quellcode:
ListView1.CustomSort(@AuswertungSortProc, 0);
   aufg := Listview1.Items.Add;
   aufg.Caption:=user;
   aufg.SubItems.Add(prio);
   aufg.SubItems.Add(text);
Das Ergebnis sieht dann so aus:

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

SnuffMaster23 6. Mär 2006 15:39

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

shmia 6. Mär 2006 16:15

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;

kaiser1401 6. Mär 2006 17:37

Re: Problem mit CustomSort in Listview
 
Danke schonmal. Werd es nachher mal ausprobieren.

alzaimar 6. Mär 2006 17:46

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.

kaiser1401 7. Mär 2006 08:02

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.

Luckie 7. Mär 2006 08:14

Re: Problem mit CustomSort in Listview
 
Zitat:

Zitat von kaiser1401
Mh, ich hab es jetzt mal mit dem source von shmia ausprobiert. das ergebnis ist zwar etwas anders, aber richtig ist es noch nciht.

Wenn du jetzt sio nett wärst und zu sagen, was nicht richtig ist, dann könnte man dir eventuell sogar helfen.

Zitat:

hat noch jemand eine idee? weiß nämlich absolut nicht warum das so nicht funktioniert.
Siehe oben.

kaiser1401 7. Mär 2006 08:27

Re: Problem mit CustomSort in Listview
 
Zitat:

Zitat von kaiser1401
Das Ergebnis sieht dann so aus:

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

Das was sich jetzt geändert hat ist, das im Ergebnis (oberer block) Zeile 3 und 4 getauscht sind. Also user2 mittig einsortiert wird.

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 :?

alzaimar 7. Mär 2006 08:32

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.

Luckie 7. Mär 2006 08:33

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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 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