Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TList.Sort akzeptiert Vergleichsfunktion nicht (https://www.delphipraxis.net/31123-tlist-sort-akzeptiert-vergleichsfunktion-nicht.html)

martin-sun 4. Okt 2004 17:44


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:
FFileList.Sort(@FCompareListItems);
Der Compiler aktzeptiert die übergebene Funktion nicht mit der Fehlermeldung:
Code:
[Fehler] FileGrid.pas(377): Variable erforderlich
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.

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.

omata 4. Okt 2004 21:56

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:
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;
dann leg eine Vergleichfunktion in deiner Klasse an...

Delphi-Quellcode:
function TFileGrid.CompareListItems(Item1, Item2: Pointer): Integer;
begin
  :
end;
und nun kommt der Trick...

Delphi-Quellcode:
  FFileList.Sort(TListSortCompare(@FCompareListItems));
Beim Aufruf mach einfach einen Typ-Cast auf die richtige Funktionsart.


MfG
Thorsten

martin-sun 5. Okt 2004 18:21

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:43 Uhr.

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