Impossible to call Binarysearch function for TObjectList

delphi, tobjectlist

Solution

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.

Problem

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; ```

Original source