Код внутри ToolCtrlsEh.pas
Код:
function TBMListEh.Find(const Item: TUniBookmarkEh; var Index: Integer): Boolean;
var
L, H, I, C: Integer;
begin
if (Compare(Item, FCache) = 0) and (FCacheIndex >= 0) then
begin
Index := FCacheIndex;
Result := FCacheFind;
Exit;
end;
Result := False;
L := 0;
H := GetCount - 1;
if H >= 0 then
begin
if Compare(FList[L], Item) > 0 then
L := 0
else if Compare(FList[H], Item) < 0 then
L := H + 1
else
begin
while L <= H do
begin
I := (L + H) shr 1;
C := Compare(FList[I], Item);
if C < 0 then L := I + 1 else
begin
H := I - 1;
if C = 0 then
begin
Result := True;
L := I;
end;
end;
end;
end;
end;
Index := L;
FCache := Item;
FCacheIndex := Index;
FCacheFind := Result;
end;
Если в списке два букмарка и первый из них совпадает с искомым, то ваш "бинарный поиск" его не найдёт. Поскольку первая ветка не исполнится (Compare = 0), вторая ветка установит L := 2 и после этого мы выйдем из функции ничего не найдя. Рабочий код такой (копипаста из System.Classes фактически)
Код:
L := 0;
H := GetCount - 1;
while L <= H do
begin
I := (L + H) shr 1;
C := Compare(FList[I], Item);
if C < 0 then L := I + 1 else
begin
H := I - 1;
if C = 0 then
begin
Result := True;
L := I;
end;
end;
end;