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.