Einzelnen Beitrag anzeigen

Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#1

List und Generics

  Alt 23. Jul 2016, 13:01
Hi,

kann mir jemand eventuell helfen? Ich habe hier folgenden Code und der funktioniert auch mit dem neuen Compiler, aber ich würde gerne die TList in Generics.Collections nutzen, anstelle der Variante in Classes. Der Grund ist das ich mit beiliegendem Code auch Objekte verwalten will.

Delphi-Quellcode:
unit SortedList;

interface

uses
  Classes;

type
  TSortedList = class(TList)
  private
    FCompare: TListSortCompare;
  protected
    procedure Notify(Ptr: Pointer; Action: TListNotification); override;
  public
    Duplicates: TDuplicates;

    constructor Create(Compare: TListSortCompare);

    function Add(Item: Pointer): Integer;
    function Find(Key: Pointer; var Index: Integer): Boolean;
    procedure Sort; overload;
    property Compare: TListSortCompare read FCompare write FCompare;
  end;

implementation

constructor TSortedList.Create(Compare: TListSortCompare);
begin
  inherited Create;
  FCompare := Compare;
end;

function TSortedList.Find(Key: Pointer; var Index: Integer): Boolean;
var
  Min, Max, Res: Integer;
begin
  Index := 0;
  result := false;
  if Count = 0 then exit;
  Min := 0;
  Max := Count;
  repeat
    Index := (Min + Max) shr 1;
    Res := FCompare(Key,List[Index]);
    if Res > 0 then //P > Items[Index]
    begin
      Inc(Index);
      Min := Index;
    end
    else begin //P <= Items[Index]
      if Res = 0 then //speed exit
      begin
        result := true;
        break;
      end;
      Max := Index;
    end;
  until Max <= Min;
end;

procedure TSortedList.Sort;
begin
  inherited Sort(FCompare);
end;

function TSortedList.Add(Item: Pointer): Integer;
begin
  if not Find(Item,result) or (Duplicates = dupAccept) then
    Insert(result,Item)
  else
    result := -1;
end;

procedure TSortedList.Notify(Ptr: Pointer; Action: TListNotification);
begin
  if (Action = lnDeleted) and (Ptr <> nil) then
    Dispose(Ptr);
end;

end.
  Mit Zitat antworten Zitat