AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TList.Sort akzeptiert Vergleichsfunktion nicht
Thema durchsuchen
Ansicht
Themen-Optionen

TList.Sort akzeptiert Vergleichsfunktion nicht

Ein Thema von martin-sun · begonnen am 4. Okt 2004 · letzter Beitrag vom 5. Okt 2004
Antwort Antwort
martin-sun

Registriert seit: 11. Aug 2004
Ort: Weinheim
15 Beiträge
 
Delphi 2005 Professional
 
#1

TList.Sort akzeptiert Vergleichsfunktion nicht

  Alt 4. Okt 2004, 17:44
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.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: TList.Sort akzeptiert Vergleichsfunktion nicht

  Alt 4. Okt 2004, 21:56
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...

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


MfG
Thorsten
  Mit Zitat antworten Zitat
martin-sun

Registriert seit: 11. Aug 2004
Ort: Weinheim
15 Beiträge
 
Delphi 2005 Professional
 
#3

Re: TList.Sort akzeptiert Vergleichsfunktion nicht

  Alt 5. Okt 2004, 18:21
danke
hat bestens funtioniert

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...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 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