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;