Вверх ↑
Ответов: 4401
Рейтинг: 690
#1: 2020-12-14 11:53:58 ЛС | профиль | цитата
Aroyl писал(а):
Похоже блок TRY - FINALLY - END в старом компоненте использовался для обхода этой ситуации.
Ну, он скрывал проблему, но не решал. По идее, пустой массив должен отсекаться на строке
if (ArrIn = nil) or (ArrIn._Count = 0) then exit;
Надо проверить верно ли ArrIn._Count=0. Кроме того, судя по коду - нет проверки на idx >= ArrIn._Count. Попробуй
if (idx < 0) or (idx >= ArrIn._Count) then exit;

А, и была проблемка с выдачей -1 из-за предварительного exit. Попробуй такой код:

procedure THIArrayFind._work_doFind0;
var
i, idx: Integer;
S1, S2: string;
begin

ItemIdx := -1;

ArrIn := ReadArray(_data_Array);
idx := ReadInteger(_Data, _data_Index, _prop_Index);

if (ArrIn = nil) or (ArrIn._Count = 0) or
(idx < 0) or (idx >= ArrIn._Count)
then
begin
_hi_CreateEvent(_Data, @_event_onFind, -1);
exit;
end;

S1 := ReadString(_Data, _data_Value, Share.ToString(_prop_Value));
if not _prop_CaseSensitive then S1 := AnsiLowerCase(S1);

for i := idx to ArrIn._Count - 1 do
begin
S2 := Share.ToString(GetArrayVal(i));
if not _prop_CaseSensitive then S2 := AnsiLowerCase(S2);

if (_prop_Partial and (Pos(S1, S2) <> 0)) or (S1 = S2) then
begin
ItemIdx := i;
break;
end;
end;

_hi_CreateEvent(_Data, @_event_onFind, ItemIdx);
end;
карма: 26

1
Голосовали:Aroyl
Редактировалось 2 раз(а), последний 2020-12-14 12:52:57