Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   List und Generics (https://www.delphipraxis.net/189800-list-und-generics.html)

Peter666 23. Jul 2016 13:01

List und Generics
 
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.

Delbor 24. Jul 2016 13:43

AW: List und Generics
 
Hi Peter666

Wieso verwendest du nicht gleich TObjektList? Wen du TObjectlist für Objekte/Klassen einsetzt und TList weiterhin für Zeiger wie bisher, hast du nach meinem dafürhalten auch einen Übersichtsvorteil.

Gruss
Delbor


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 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