Подписка

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

Наши проекты

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 24 августа 2009 в 20:18.
Категории: Delphi в Web.


Пока пишется и дорабатывается новая версия "Блевантона", рассмотрим один из вопрос, который довольно часто не дает спокойно спать начинающим программистам - работу с элементами веб-форм - SELECT (списки выбора).

Я не случайно перехожу сразу к такому сложному, на первый взгляд вопросу, опуская более простые, например заполнение текстовых полей. Тем, кто хочет разобраться в основах заполнения веб-форм я настоятельно рекомендую ознакомиться с постами Марии, автора блога "Парсинг и Я". Признаюсь честно - лучше я бы объяснить не смог :). В качестве практической части Мария разработала небольшую утилиту по регистрации RSS-каналов блога в различных RSS-каталогах. Вполне возможно, что кто-то захочет, используя её и мой опыт написать более универсальную и функциональную программу. А для того, чтобы Ваша программа в чем-то превосходила своих конкурентов - мы и рассмотрим вопрос по работе со списками SELECT.

На самом деле, работа с этими элементами практически не отличается от работы с теми же полями ввода. Давайте посмотрим, как выглядит список SELECT изнутри:


   Крымские новости
   Памятники Крыма
   Новости рынка недвижимости

Вот пример списка с четырьмя возможными вариантами выбора один из которых - пустая строка. Судя по коду, для того, чтобы выбрать необходимый элемент на форме нам необходимо знать:

  1. Имя списка (атрибут name у тега select)
  2. Текст внутри тега option

Если изобразить графически список SELECT с двумя строками выбора, то получается примерно следующая картинка:

SELECTЗелеными флажками на рисунке отмечены данные, которые нам необходимо знать, чтобы однозначно выбирать тот или иной элемент списка.

Красным обозначены атрибуты, которые можно не рассматривать, но, в зависимости от фантазии программистов, пишущих каталоги, и эти атрибуты могут быть кое-где задействованы (был у меня однажды такой опыт при работе с каталогами сайтов).

Со свойством innerText я Вас уже знакомил на протяжении двух статей. Так что, остается разобрать на части наш SELECT. Сразу прикинем алгоритм работы.

Во-первых, необходимо найти на форме необходимый список.

Во-вторых, определить все видимые строки в этом списке.

В третьих, определить элемент списка, необходимый именно нам, например, это будет название категории в которую мы хотим добавить нашу RSS-ленту.

В-четвертых, нам необходимо выделить этот элемент на странице.

Пойдем по порядку, не забывая, что в мире есть такое понятие как DOM.

1. Объявляем переменные

Объявим три переменные:

var DocS   : IHTMLElementCollection;
    Element: IHTMLElement;
    Options: IHTMLSelectElement;

DocS - коллекция однотипных элементов на странице;
Element - здесь будем хранить один из элементов коллекции;
Options - а это необходимый нам список.

Как видите,   в нашем распоряжении появляется ещё один интерфейс IHTMLSelectElement, который и предоставляет нам методы работы со списками.

2. Ищем список для выбора категории

Поиск необходимого списка SELECT можно организовать вот в таком простеньком цикле:

...
DocS:=(WebBrowser1.Document as IHTMLDocument2).all.tags('select') as IHTMLElementCollection;
for I:=0 to Docs.length-1 do
  begin
    Element:=DocS.item(i,0)as IHTMLElement;
    if Element.getAttribute('name',0)='rss_cat' then
      begin
        ShowMessage('Элемент формы найден');
        Options:=(Element as IHTMLSelectElement);
      end;
...

То есть, здесь мы поочередно перебрали все элементы SELECT на странице и определили необходимый нам список с помощью его атрибута name. После чего присвоили значение Element переменной Options.

3. Определяем необходимый элемент списка и выделяем его

Здесь опять же воспользуемся циклом по всем элементам OPTION найденного списка:

for j:= 0 to Options.length-1 do
  begin
    if (Options.item(j,0)as IHTMLElement).innerText='Памятники Крыма' then
      Options.selectedIndex:=j;
  end;

Как видите, в данном случае я проводил поиск с целью найти элемент списка, содержащего точную фразу "Памятники Крыма". С небольшим изменением этот же цикл можно приучить выискивать неточные совпадения или сравнивать каждый элемент списка с целым перечнем Ваших категорий.
Кстати, для неточного сравнения строк можно использовать наивный алгоритм.

4. Резюме

Итак, для того, чтобы получить доступ ко всем элементам списка необходимо использовать в работе интерфейс IHTMLSelectElement, предоставляющий доступ к методам работы со списками. Причем, для работы с этим интерфейсом не обязательно использовать промежуточный переход от IHTMLElemet к IHTMLSelectElement, как это делал я.  Я просто показал по шагам как добраться до списка. Более рациональным вариантом цикла поиска и выделения необходимого элемента списка будет следующий:

DocS:=(WebBrowser1.Document as IHTMLDocument2).all.tags('select') as IHTMLElementCollection;
for I:=0 to Docs.length-1 do
  begin
    Element:=DocS.item(i,0)as IHTMLSelectElement;
    if Element.name='rss_cat' then
      begin
        ShowMessage('Элемент формы найден');
        for j:= 0 to Element.length-1 do
          begin
            if (Element.item(j,0)as IHTMLElement).innerText='Памятники крыма' then
              Element.selectedIndex:=j;
          end;
      end;
  end;

Здесь я не использую лишних интерфейсов и сразу работаю со списком. Ведь я ясно указал в начале, что мне необходима коллекция всех SELECT со страницы. Вот так запросто Вы можете написать программу для регистрации в каталогах и при этом программа сама найдет и выделит необходимую категорию. Кстати, про регистрацию в каталогах. Думаю, всем уже давно известно для чего она проводится - для раскрутки Вашего сайта. Если Вы не хотите лишний раз заморачиваться над раскруткой своего веб-проекта, то можете просто заказать продвижение сайтов в Москве и полностью посвятить себя наполнению сата полезной информацией, а специалисты раскрутят Ваш сайт сами.

Мой блог находят по следующим фразам

Понравилась статья? Тогда:
Делись! Загружай! Плюсуй!
   Отправить PDF на   
Читай ещё статьи на WebDelphi.ru

Комментарии (2)

WP_Cloudy
  • Masha пишет:

    По «странному стечению обстоятельств» у меня в заготовках для публикации на блоге тоже уже написана статья про работу с селектами)) Хотя — ничего странного, у нас же тематики пересекаются)

  • Vlad пишет:

    Но подходы к решению задачи у нас разные? Я обычно все что касается парсинга читал :)

Ваш ответ

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

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

   


консультант плюс, законодательство, скачать консультантплюс