Einzelnen Beitrag anzeigen

Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: TComponentList.Sort Problem

  Alt 2. Okt 2006, 12:50
Hallo berens,

TList.Sort erwartet einen Zeiger auf eine einfache (nicht lokale) Funktion, keine Methode.

Versuche es einmal mit diesen Änderungen:

Delphi-Quellcode:
// TMyListSortCompare = function (Item1, Item2: Pointer): Integer of object; // nicht mehr benötigt

TBar= class(TMyPanel)
private
public
  ID: integer;
  intSort: integer;
  :
end;

Tfoo= class(TMyPanel)
private
// FCompareListItems:TMyListSortCompare; // ersetzt
  FCompareListItems:TListSortCompare; // neu
// function CompareSortID(Item1, Item2: Pointer): Integer; // nicht mehr benötigt
  :
public
  ComponentList: TComponentList;
  :
  constructor Create(_Owner: TComponent); override;
end;

// neu (ersetzt alte Methode)
function CompareSortID(Item1, Item2: Pointer): Integer;
begin
  if Assigned(Item1) and Assigned(Item2) then
    Result := TBar(Item1).intSort - TBar(Item2).intSort
  else
    Result := 0;
end;

constructor Tfoo.Create(_Owner: TComponent);
begin
  inherited Create(_Owner);
  :
  ComponentList := TComponentList.Create(True);
  FCompareListItems:= CompareSortID;
  :
end;

{ durch neue Routine ersetzt
function Tfoo.CompareSortID(Item1, Item2: Pointer): Integer;
begin
  if not Assigned(Item1) or not Assigned(Item2) then begin
    Result := 0;
    Exit;
  end;
  if (TBar(Item1).intSort < TBar(Item2).intSort) then begin
    Result := -1; // i1 < i2
  end else begin
    if (TBar(Item1).intSort = TBar(Item2).intSort) then begin
      Result := 0; // i1 = i2
    end else begin
      Result := 1; // i1 > i2
    end;
  end;
end;
}


procedure Tfoo.Sort;
begin
  if ComponentList.Count > 1 then begin
// ComponentList.Sort(TListSortCompare(@FCompareListItems)); // ersetzt
    ComponentList.Sort(FCompareListItems); // neu
  end;
end;
Gruß Hawkeye
  Mit Zitat antworten Zitat