Delphi-Forum.de Delphi-Library.de
C-Sharp-Forum.de C-Sharp-Library.de
Registrieren Login Suche Hilfe Sitemap
TList sortieren
spacer
Autor Nachricht
jazz123
Hält's aus hier

Beiträge: 3
Dabei seit: 22.02.2010



BeitragVerfasst: Fr 05.03.10 00:29  Antworten mit Zitat Beitrag melden
Hallo,

ich möchte eine Tlist sortieren.

hier die Entity Klasse

ausblenden volle Höhe Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
unit item;

interface

uses
SysUtils;

type

Itemclass = class
id : integer;
name : String;
description : String;

constructor Create(pId : Integer; pName, pDescription : String);
function getText: String;
end;

implementation

constructor Itemclass.Create(pId : Integer; pName, pDescription : String);
begin
id := pid;
name := pname;
description := pDescription;
end;

function Itemclass.getText;
begin
result := inttostr(id)+' '+name+' '+description;
end;

end.


und hier die TForm:

ausblenden volle Höhe Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
unit main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, item;

type

TMyListSortCompare = function (Item1, Item2: Pointer): Integer of object;

TForm1 = class(TForm)
sortBtn: TButton;
ListBox1: TListBox;

procedure FormCreate(Sender: TObject);
procedure sortBtnClick(Sender: TObject);
private
{ Private-Deklarationen }

itemlist : Tlist;
FCompareListItems:TMyListSortCompare;
function CompareListItems(Item1, Item2: Pointer): Integer;
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation



{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i1,i2,i3,i4,i5: Itemclass;
begin
FCompareListItems:=CompareListItems;
itemlist := tlist.Create;

i1 := Itemclass.Create(1,'item 1','desc');
i2 := Itemclass.Create(4,'item 4','desc');
i3 := Itemclass.Create(5,'item 5','desc');
i4 := Itemclass.Create(1,'item 1','desc');
i5 := Itemclass.Create(2,'item 2','desc');

itemlist.Add(i1);
itemlist.Add(i2);
itemlist.Add(i3);
itemlist.Add(i4);
itemlist.Add(i5);
end;

procedure TForm1.sortBtnClick(Sender: TObject);
var
i : integer;
begin
for I := 0 to itemList.Count - 1 do
ListBox1.AddItem(Itemclass(itemlist[i]).getText,itemlist[i]);
ListBox1.AddItem('-------------',nil);

itemlist.Sort(TListSortCompare(@FCompareListItems));

for I := 0 to itemList.Count - 1 do
ListBox1.AddItem(Itemclass(itemlist[i]).getText,itemlist[i]);
end;

function TForm1.CompareListItems(Item1, Item2: Pointer): Integer;
begin
if Itemclass(item1).id < Itemclass(item2).id then
result := -1
else if Itemclass(item1).id > Itemclass(item2).id then
result := 1
else
result := 0;
end;

end.


Problem: das sortieren mittels der sort Function von TList funktioniert nicht. Wenn ich mir die compare Methode mittels Debugger anschaue, fällt auf das Pointer1 = Pointer2 ist aber wieso ?

hier die Ausgabe
Zitat:
unsortiert:
1 item 1 desc
4 item 4 desc
5 item 5 desc
1 item 1 desc
2 item 2 desc
------------
nach (nicht) erfolgter Sortierung:
1 item 1 desc
4 item 4 desc
5 item 5 desc
1 item 1 desc
2 item 2 desc



Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 05.03.2010 um 09:57
Moderiert von user profile iconNarses: Inline- in normalen Anhang umgewandelt.
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von jazz123 am Fr 05.03.10 00:54, insgesamt 1-mal bearbeitet
Private Nachricht sendenPosting in privater Nachricht zitieren
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Moderator

Beiträge: 2865
Erhaltene Danke: 11
Dabei seit: 12.11.2005
Wohnort: Brackenheim

Win 7
F#, C# (VS2010)
BeitragVerfasst: Fr 05.03.10 00:42  Antworten mit Zitat Beitrag melden
Warum definierst du dein eigenes TListSortCompare und speicherst den Methodenzeiger in einem Feld? Das echte ist jedenfalls ein Funktionszeiger, muss also außerhalb einer Klasse (oder mit class function und static) deklariert werden.
Und wann die Vergleichsfunktion welches Ergebnis liefern muss, solltest du dir auch noch einmal anschauen.

_________________
>λ=
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
jazz123
Hält's aus hier

(Threadstarter)

Beiträge: 3
Dabei seit: 22.02.2010



BeitragVerfasst: Fr 05.03.10 00:53  Antworten mit Zitat Beitrag melden
Die Idee mit dem Methodenzeiger habe ich von hier: www.delphipraxis.net/topic36038.html Ich wollte gern die compare Funktion in die Klasse schreiben und nicht außerhalb.

Die Vergleichsfunktion habe ich korrigiert aber sortieren funktioniert trotzdem nicht !?
Private Nachricht sendenPosting in privater Nachricht zitieren
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Moderator

Beiträge: 2865
Erhaltene Danke: 11
Dabei seit: 12.11.2005
Wohnort: Brackenheim

Win 7
F#, C# (VS2010)
BeitragVerfasst: Fr 05.03.10 01:51  Antworten mit Zitat Beitrag melden
user profile iconjazz123 hat folgendes geschrieben Zum zitierten Posting springen:
Die Idee mit dem Methodenzeiger habe ich von hier: www.delphipraxis.net/topic36038.html
Bin mittlerweile in Delphi wohl wirklich nicht mehr fit, denn ich kann mir nicht vorstellen, wie das dabei mit dem impliziten Self-Parameter funktionieren soll :nixweiss: .

user profile iconjazz123 hat folgendes geschrieben Zum zitierten Posting springen:
Ich wollte gern die compare Funktion in die Klasse schreiben und nicht außerhalb.
Also static ;) .

_________________
>λ=
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star

Beiträge: 1548
Dabei seit: 09.11.2005


Win 7, VM
BeitragVerfasst: Fr 05.03.10 13:24  Antworten mit Zitat Beitrag melden
Hi! Ich schlage vor Du definiertst wie folgt:
ausblenden Delphi-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function CompareNames(Item1, Item2: Pointer): Integer;
begin
//Result := CompareText(ItemClass(Item1).getText, ItemClass(Item2).getText);

if ItemClass(Item1).id = ItemClass(Item2).id then // IDs gleich?
Result := CompareText(ItemClass(Item1).getText, ItemClass(Item2).getText) // Dann kommt's auf den Text an
else
if ItemClass(Item1).id > ItemClass(Item2).id then
result := 1
else
result := -1;
end;
...
itemlist.Sort(@CompareNames);

Funktioniert einwandfrei. Warum Du es allerdings derart kompliziert über einen Methodenzeiger machst, ist mir nicht ganz klar. :gruebel:

Edit: Hab den Link völlig übersehen. :roll:
In der DP hat aktuell jemand das gleiche Problem. Von TList abgeleitete Klasse um Methode Sort erweitern
Ein weiterer gescheiterter Lösungsanssatz :? class function <> normale function mit Klassenzugehörigkeit?

Grüße,
Marc

_________________
Nothing Is Real
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Beiträge vom vorherigen Thema anzeigen:   
home home