Собственно, этот пост расчитан на тех, кто только учится Delphi. Для тех, кто не в курсе существования функции AnsiIndexStr в Delphi скажу, что функция располагается в модуле для работы со строками (StrUtils). Возвращаемый результат — индекс строки в массиве строк. Если элемент массива, соответствующий заданой подстроке не найден в массиве, то функция вернет значение -1. Сам листинг функции выглядит следующим образом:
function AnsiIndexStr(const AText: string; const AValues: array of string): Integer; var I: Integer; begin Result := -1; for I := Low(AValues) to High(AValues) do if AnsiSameStr(AText, AValues[I]) then begin Result := I; Break; end; end;
Т.е. последовательно проверяется каждый элемент массива и если находится совпадение, то цикл прерывается. Теперь пишем такой примерчик:
const Mass: array [1..10]of string = ('1','2','3','4','5','6','7','8','9','10'); [...] procedure TForm7.Button1Click(Sender: TObject); begin Label2.Caption:=IntToStr(AnsiIndexStr(Edit1.Text,Mass)); label5.Caption:=IntToStr(Low(Mass)); label7.Caption:=IntToStr(High(Mass)); end;
То есть при нажатии на кнопку в label2 выводится значение функции AnsiIndexText, в label5 нижний индекс массива, в label7 — верхний. В Edit вводится искомая подстрока (число от 1 до 10).
Заносим в Edit число 1, жмем кнопку и видим:
Верхнияя и нижняя гланица массива определилась правильно — массив от 1 до 10, а функция откуда-то берет значение 0 (!). Точно такой же результат получается, если сменить границы у массива и сделать, например так:
const Mass: array [-1..8]of string = ('1','2','3','4','5','6','7','8','9','10');
Результат функции для значения 1 — 0. Отсюда небольшой вывод: если в Вашей программе предусмотрен поиск по массиву с использованием функции AnsiIndexStr, то следует учитывать, что передаваемый в функцию массив (даже определенный как типизированная константа) будет динамическим с начальным индексом 0, а не 1 или каким-либо другим. Отсюда же логично заметить, что при работе с массивами лучше сразу задавать нижнюю границу от 0 — будет меньше проблем в будущем.
Логично что индекс первого элемента в массиве равен 0. Так как при передаче массива изменится его тип.
Создайте копию этой функции и измените так:
begin
Result := Low(AValues);
end;
и у вас всегда будет возвращать 0.
Или поставте Breakpoint в функции и посмотрите на массив в Local Variables. Там индексы массива начинаются с нуля.