У вас есть одна единственная ошибка, тип переменной myvalue
должен быть PMyArray
, а не QmyArray
. В следующий раз, когда вы столкнетесь с такой проблемой, попробуйте использовать длинную версию TArray.BinarySearch
, чтобы Code Insight действительно показывал значимые имена типов.
Когда вы пишете:
TArray.BinarySearch(myarray, myvalue, index, iComparer)
компилятор должен угадать тип вашего массива по параметрам. Если вы не соответствуете типам myarray
и myvalue
, компилятор не может сказать, что вы действительно хотите, и понимание кода не имеет шансов фактически показать вам, чего он хочет. Но вы можете помочь ему, указав тип массива, с которым хотите работать, используя следующий синтаксис:
TArray.BinarySearch<PmyArray>(myarray, myvalue, index, iComparer)
При этом компилятор знает, что вы собираетесь работать с массивом PmyArray
. Понимание кода также знает это и показывает точные типы параметров, которые ему нужны.
Это работает:
program Project9;
{$APPTYPE CONSOLE}
uses
SysUtils, Generics.Collections, Generics.Defaults;
type
QmyArray = array of Integer;
PmyArray = record
element: QmyArray;
value: Integer;
end;
TMyArray = array of PmyArray;
var myarray: TMyArray;
myvalue: PmyArray;
FoundIndex: Integer;
function CompareB(const Left, Right: integer): Integer;
begin
if Left < Right then
Result := -1
else if Left > Right then
Result := 1
else
Result := 0;
end;
function CompareA(const Left, Right: pmyarray): Integer;
var
iIndex: Integer;
begin
Result := CompareB(Left.element[0], Right.element[0]);
for iIndex := 1 to High(Right.element) do
if Result = 0 then
Result := CompareB(Left.element[iIndex], Right.element[iIndex]);
end;
begin
TArray.BinarySearch<PmyArray>(myarray, myvalue, FoundIndex, TComparer<PmyArray>.Construct(CompareA));
end.