![]() |
TList.Sort akzeptiert Vergleichsfunktion nicht
hallo leute,
ich hab ein problem mit dem sortieren eines TList objektes. bisher habe ich immer nur die für die Sort-Funktion des TList objektes benötigte funktion (TListSortCompore) seperat in einer unit gehabt. das hat auch prima geklappt. diesmal bastel ich jedoch an einer komponente deren daten in einem TList objekt verwaltet werden (FFileList). für das sortieren muss ich auf daten in der klasse zurückgreifen (FSortBy, FSortUpDown). daher habe ich eine vergleichsroutine gebastelt, die genau dieses innerhalb der klasse tut (FCompareListItems). das problem entsteht beim aufruf der sort-funktion:
Code:
Der Compiler aktzeptiert die übergebene Funktion nicht mit der Fehlermeldung:
FFileList.Sort(@FCompareListItems);
Code:
Befindet sich die funktion (FCompareListItem) ausserhalb der klasse, dann funktioniert es toll. Aber zum einen finde ich das nicht schön, da sie ja irgendwie in die klasse gehört und was viel schlimmer ist, von ausserhalb kann ich nicht auf die objektvariablen FSortBy und FSortUpDown zugreifen.
[Fehler] FileGrid.pas(377): Variable erforderlich
hat jemand ne ahnung wo das problem liegt oder was ich falsch mache? martin
Delphi-Quellcode:
unit FileGrid;
interface TFileGrid = class(TDrawGrid) private FFileList: TList; FSortBy: Integer; FSortUpDown: Integer; function FCompareListItems(Item1, Item2: Pointer): Integer; procedure FOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); protected public constructor Create(AOwner:Tcomponent); override; end; implementation constructor TFileGrid.Create(AOwner: Tcomponent); begin inherited; OnMouseDown := FOnMouseDown FFileList := TList.Create; end; procedure TFileGrid.FOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var ACol, ARow: Integer; begin MouseToCell(X, Y, ACol, ARow); else if (ARow = 0) then begin FSortBy := ACol + 1; FFileList.Sort(@FCompareListItems); end; end; end. |
Re: TList.Sort akzeptiert Vergleichsfunktion nicht
Moin,
tja da musst du ein bißchen tricksen... Leider ist in der Unit Classes der Typ der Vergleichsfunktion nicht von object abgeleitet, deshalb kann nur eine Funktion, die zu keiner Klasse gehört übergeben werden. Deklariere dir folgenden Typ in deiner Unit, eine private/globale Variable von diesem Typ und weise die Vergleichsfunktion dieser Variablen zu:
Delphi-Quellcode:
dann leg eine Vergleichfunktion in deiner Klasse an...
type
TMyListSortCompare = function (Item1, Item2: Pointer): Integer of object; : TFileGrid = class(TDrawGrid) private FCompareListItems:TMyListSortCompare; : public : end; : constructor TFileGrid.Create(AOwner: Tcomponent); begin inherited; FCompareListItems:=CompareListItems; : end;
Delphi-Quellcode:
und nun kommt der Trick...
function TFileGrid.CompareListItems(Item1, Item2: Pointer): Integer;
begin : end;
Delphi-Quellcode:
Beim Aufruf mach einfach einen Typ-Cast auf die richtige Funktionsart.
FFileList.Sort(TListSortCompare(@FCompareListItems));
MfG Thorsten |
Re: TList.Sort akzeptiert Vergleichsfunktion nicht
danke
hat bestens funtioniert :thumb: jetzt wo ich den grund und die lösung weiß, hab ich auch in der delphi-hilfe einen beitrag dazu gefunden. wär ich aber vorher nie im leben darauf gekommen das es daran liegt. also danke noch mal... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 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