delphi – 无法为TObjectList调用Binarysearch函数

如果我们查看XE2或XE3 for TObjectList methods的在线帮助
,我们看到了tobjectList可以访问binarysearch函数.但是如果我们尝试进入XE3,它甚至都不会编译.

对于该示例,sort函数也可用,但是这个编译.

欢迎任何想法.

示例代码:

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.

正如David Heffernan所建议的那样,请遵循sort函数的比较器代码.

对于那些感兴趣的人,请遵循比较器方法的代码:

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;

解决方法

您链接到的文档是针对通用容器TObjectList< T>来自Generics.Collections单元.

但是,您在代码中使用的类是Contnrs单元中的遗留非泛型容器TObjectList.

您尝试使用的BinarySearch方法仅存在于泛型类中.

如果切换到通用容器,那么您会发现可以从类中删除大部分样板代码.它成为了:

TTPRODDataList = class(TObjectList<TTPRODData>)
public
  procedure SortOnProductCode;
end;

您不需要GetItem,SetItem和Items,因为类型安全的泛型类已经对该功能进行了排序.

您需要做的唯一工作是调整您的排序代码以适应Delphi通用容器使用的稍微不同的界面.

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...