If we look into the online help of XE2 or XE3 for TObjectList methods , we see that the binarysearch function is accessible for the TObjectList. But if we try into XE3 it doesn't even compile.
For the example, the sort function is available also, but this one compile.
Any idea is welcome.
Sample code :
unit FM_Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Contnrs, Vcl.CheckLst, System.Generics.Collections;
type
TTPRODData = class
private
FData1 : String;
FData2 : String;
FCount : Integer;
public
constructor Create; overload;
destructor Destroy; override;
end;
TTPRODDataList = class(TObjectList)
function GetItem(Index: Integer): TTPRODData;
procedure SetItem(Index: Integer; const Value: TTPRODData);
public
constructor Create; overload;
destructor Destroy; override;
property Items[Index: Integer]: TTPRODData read GetItem write SetItem; default;
procedure SortOnProductCode;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//
// Sort function.
//
function CompareProductCode(Item1, Item2: Pointer): Integer;
begin
Result := CompareStr(TTPRODData(Item1).FData1, TTPRODData(Item2).FData1);
end;
//
//
//
procedure TForm1.Button1Click(Sender: TObject);
var
aProdList : TTPRODDataList;
aDummy : TTPRODData;
aNdx : Integer;
begin
aProdList := TTPRODDataList.Create;
// This call works.
aProdList.Sort(CompareProductCode);
// This call doesn't even compile !
aProdList.BinarySearch(aDummy, aNdx);
end;
{ TTPRODData }
constructor TTPRODData.Create;
begin
inherited Create;
FData1 := '';
FData2 := '';
FCount := 0;
end;
destructor TTPRODData.Destroy;
begin
inherited;
end;
{ TTPRODDataList }
constructor TTPRODDataList.Create;
begin
inherited Create;
end;
destructor TTPRODDataList.Destroy;
begin
Clear;
inherited;
end;
function TTPRODDataList.GetItem(Index: Integer): TTPRODData;
begin
result := TTPRODData(inherited GetItem(index));
end;
procedure TTPRODDataList.SetItem(Index: Integer; const Value: TTPRODData);
begin
inherited setItem(index, value);
end;
procedure TTPRODDataList.SortOnProductCode;
begin
Sort(CompareProductCode);
end;
end.
As suggested by David Heffernan, here follow the code for the comparer for the sort function.
For those who are interested, here follow the code for the comparer method:
TTProdComparer = class(TComparer<TTPRODData>)
public
function Compare(const Item1, Item2: TTPRODData): Integer; override;
end;
And the code :
{ TTProdComparer }
function TTProdComparer.Compare(const Item1, Item2: TTPRODData): Integer;
begin
Result := CompareStr(Item1.FData1 , Item2.FData1 );
end;
The documentation that you have linked to is for the generic container TObjectList<T>
from the Generics.Collections
unit.
But the class that you have used in your code is the legacy non-generic container TObjectList
from the Contnrs
unit.
The BinarySearch
method that you are trying to use only exists on the generic class.
If you switch to the generic container then you'll find that you can remove most of the boiler-plate code from your class. It becomes:
TTPRODDataList = class(TObjectList<TTPRODData>)
public
procedure SortOnProductCode;
end;
You don't need GetItem
, SetItem
and Items
because the type-safe generic class already has that functionality sorted.
The only work you have to do is to adapt your sorting code to fit with the somewhat different interface used by the Delphi generic containers.