gpt4 book ai didi

delphi - 无法为 TObjectList 调用 Binarysearch 函数

转载 作者:行者123 更新时间:2023-12-03 15:46:41 24 4
gpt4 key购买 nike

如果我们查看 XE2 或 XE3 的在线帮助 TObjectList methods,我们看到 TObjectList 可以访问二元搜索函数。但如果我们尝试使用 XE3,它甚至无法编译。

例如,排序函数也可用,但这个可以编译。

欢迎任何想法。

示例代码:

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 的建议,这里遵循排序函数的比较器代码。

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

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单位。

但是您在代码中使用的类是旧版非泛型容器 TObjectList来自Contnrs单位。

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

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

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

您不需要GetItem , SetItemItems因为类型安全的泛型类已经排序了该功能。

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

关于delphi - 无法为 TObjectList 调用 Binarysearch 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14599194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com