Подписка

добавить на Яндекс

Наши проекты

Delphi+Google

Google API

Google API в Delphi - проект с открытым исходным кодом.

Chrono

Chrono

Хронометр - программа для ведения списка задач.

ODFProc

ODFProc

ODFProc - работа с документами OpenOffice в Lazarus и FreePascal.

Поддержка блога

А тут я коплю на лицензию Delphi XE на iPad =).
Сумма пожертвования не фиксирована.

Публикации

Год назад

Случайный пост

Последние

Сообщения форума

Комментарии

Социальные сети

Google

Facebook

Twitter

Опрос

Вы сейчас или в ближайшем обозримом будущем планируете разрабатывать кроссплатформенное приложение с использованием Firemonkey?



Loading ... Loading ...

Блоги и сообщества

Статьи по Delphi DelphiFeeds.ru - Все Delphi-блоги Рунета Сообщество умных людей VR-Online.RU Бесплатный журнал для программистов и всех, кто интересуется IT Статьи и уроки по Delphi Новостной блог о высоких технологиях
Система Orphus
Опубликовал Vlad 10 марта 2010 в 20:31.
Категории: Основы Delphi.


Собственно, этот пост расчитан на тех, кто только учится 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 - будет меньше проблем в будущем.

-------------------------------
Не успели подарить любимой подарок на 8-е марта? Не проблема - подарите ей дорогой подарок, что-нибудь из бытовой техники. Вот, например посудомоечные машинки - чем не подарок домохозяйке? А здесь можно купить кухонный комбайн. Думаю, что любая домохозяйка будет рада таким подаркам.
-------------------------------
Понравилась статья? Тогда:
Делись! Загружай! Плюсуй!
   Отправить PDF на   
Читай ещё статьи на WebDelphi.ru

1 комментарий

WP_Cloudy
  • Lavren пишет:

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

Ваш ответ

Внимание: Все комментарии модерируются, и это может вызвать задержку их публикации. Отправлять комментарий заново не требуется.

Пожалуйста, заключайте исходный код в тэги [code][/code].
Если код большой, то воспользуйтесь Вставкой кода на отдельной странице и оставьте в комментарии ссылку на исходник