2013-01-30 4 views
3

Si l'on regarde dans l'aide en ligne de XE2 ou XE3 pour TObjectList methods , on voit que la fonction binarysearch est accessible pour TObjectList. Mais si nous essayons XE3, il ne compile même pas.Impossible d'appeler la fonction Binarysearch pour TObjectList

Pour l'exemple, la fonction de tri est également disponible, mais celle-ci est compilée.

Toute idée est la bienvenue.

Exemple de 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. 

Comme suggéré par David Heffernan, voici le code pour suivre le comparateur pour la fonction de tri.

Pour ceux qui sont intéressés, voici suivre le code de la méthode de comparateur:

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; 

Répondre

7

La documentation que vous avez lié à est pour le conteneur générique TObjectList<T> de l'unité Generics.Collections.

Mais la classe que vous avez utilisée dans votre code est le conteneur non générique hérité TObjectList de l'unité Contnrs.

La méthode BinarySearch que vous essayez d'utiliser n'existe que dans la classe générique.

Si vous passez au conteneur générique, vous constaterez que vous pouvez supprimer la plus grande partie du code de plaque de chaudière de votre classe. Il devient:

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

Vous n'avez pas besoin GetItem, SetItem et Items parce que le type de sécurité classe générique a déjà cette fonctionnalité triée. Le seul travail que vous avez à faire est d'adapter votre code de tri à l'interface quelque peu différente utilisée par les conteneurs génériques Delphi.

Questions connexes