![]() |
Fehler in Vergleichsfunktion von TList.Sort
Hallo,
ich habe mir für mein Programm, das eine Art Adressbuch werden soll, das Thema zur Listensortierung( ![]()
Delphi-Quellcode:
Die Vergleichsfunktion wird akzeptiert, jedoch kriege ich beim Aufrufen der Methode eine Exception (Access violation). Beim Debuggen ist mir aufgefallen, dass man schon beim ersten Durchlauf nicht auf tmpEntry2 zugreifen kann (Inaccessable Value). tmpEntry1 erscheint mit den eingegebenen Werten, also ganz normal. Durch das Fehlen von tmpEntry2 hat sich der Rest natürlich erübrigt...
type
TMyListSortCompare = function(Item1, Item2: Pointer): Integer of Object; TDirectory = class private fEntryList: TList; fCompareListItems: TMyListSortCompare; public constructor Create; function CompareListItems(Item1, Item2: Pointer): Integer; procedure AddEntry(Entry: TEntry); procedure Sort; end; implementation constructor TDirectory.Create; begin inherited; fEntryList:=TList.create; fCompareListItems:=CompareListItems; end; procedure TDirectory.AddEntry(Entry: TEntry); begin fEntryList.Add(Entry); ShowMessage('Item added (' + Entry.LastName + ')'); end; function TDirectory.CompareListItems(Item1, Item2: Pointer): Integer; var tmpEntry1, tmpEntry2: TEntry; tmpText1, tmpText2: string; begin tmpEntry1:=TEntry(Item1); tmpEntry2:=TEntry(Item2); //Beim ersten Durchlauf Inaccessable Value tmpText1:=tmpEntry1.LastName; tmpText2:=tmpEntry2.LastName; Result := CompareText(tmpText1, tmpText2); end; procedure TDirectory.Sort; begin try fEntryList.Sort(TListSortCompare(@fCompareListItems)); ShowMessage('Items sorted: ' + TEntry(fEntryList.Items[0]).LastName //Zu Testzwecken füge ich am Anfang 4 Einträge ein... + TEntry(fEntryList.Items[1]).LastName + TEntry(fEntryList.Items[2]).LastName + TEntry(fEntryList.Items[3]).LastName); except ShowMessage('Items not sorted'); end; end; Weiß jemand, was ich da verbockt haben könnte? |
Re: Fehler in Vergleichsfunktion von TList.Sort
Zitat:
Da Delphi recht typensicher ist, erkennt er richtigerweise, dass dies keine gültige Sortierroutine ist. Dies ist auch vollkommen richtig so. Der verlinkte Beitrag umgeht die Typprüfung einfach, behebt aber nicht den Grund für die Inkompatiblität. Die Lösung kann auch definitiv nicht klappen, da die Sortierroutine immernoch kein Self Parameter übergibt auf Aufruf. Damit verrutschen die Parameter und damit ist Item2 das eigentliche Item1 und Items1 ist deine Instanzenklasse - aber das willst du nicht haben. Schlussendlich zu deinem Problem:
Delphi-Quellcode:
type
TDirectory = class private fEntryList: TList; public constructor Create; procedure AddEntry(Entry: TEntry); procedure Sort; end; implementation constructor TDirectory.Create; begin inherited; fEntryList:=TList.create; end; procedure TDirectory.AddEntry(Entry: TEntry); begin fEntryList.Add(Entry); ShowMessage('Item added (' + Entry.LastName + ')'); end; function CompareListItems(Item1, Item2: Pointer): Integer; var tmpEntry1, tmpEntry2: TEntry; tmpText1, tmpText2: string; begin tmpEntry1:=TEntry(Item1); tmpEntry2:=TEntry(Item2); //Beim ersten Durchlauf Inaccessable Value tmpText1:=tmpEntry1.LastName; tmpText2:=tmpEntry2.LastName; Result := CompareText(tmpText1, tmpText2); end; procedure TDirectory.Sort; begin try fEntryList.Sort(CompareListItems); ShowMessage('Items sorted: ' + TEntry(fEntryList.Items[0]).LastName //Zu Testzwecken füge ich am Anfang 4 Einträge ein... + TEntry(fEntryList.Items[1]).LastName + TEntry(fEntryList.Items[2]).LastName + TEntry(fEntryList.Items[3]).LastName); except ShowMessage('Items not sorted'); end; end; |
Re: Fehler in Vergleichsfunktion von TList.Sort
Damit habe ich ja wieder das alte Problem:
Delphi-Quellcode:
List.Sort(@CompareListItems);
Zitat:
|
Re: Fehler in Vergleichsfunktion von TList.Sort
Zitat:
|
Re: Fehler in Vergleichsfunktion von TList.Sort
Ouh, tut mir Leid.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 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