уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Собственно, этот пост расчитан на тех, кто только учится 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 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
1 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Lavren
Lavren
11/03/2010 11:30

Логично что индекс первого элемента в массиве равен 0.  Так как при передаче массива изменится его тип.
Создайте копию этой функции и измените так:
begin
Result := Low(AValues);
end;
и у вас всегда будет возвращать 0.
Или поставте Breakpoint в функции и посмотрите на массив в Local Variables. Там индексы массива начинаются с нуля.