вторник, 15 сентября 2009 г.

Бразуер

Как и в любой нормальной среде разработки, в HiAsm должны быть компоненты на все случаи жизни (ну, или почти на все:). И когда штатный браузер уже не устраивает, то самое время открыть HiAsm и проявить свою фантазию.
Сразу оговорюсь, что компонент WebBrowser построен на основе IE, то есть отображаться сайты в нём будут так, как в Internet Explorer. Однако офрмление программы можно сделать по своему вкусу и в своём стиле.

Этот компонент находится на влкдаке "интерфейс" сразу после мультиэлемента "группа элементов". У браузера в основном стандартные для всех визуальных компонентов свойства, но есть два собственных - это URL, который определяет начальный адрес, загружаемый при старте программы, и Silent, который разрешает или запрещает отображение ошибок JavaScript.

Из параметра URL желательно всё убрать, оставив его пустым, иначе вы не сможете загрузить страницу по адресу из потока, а только через точку данных.

Здесь объясню, почему так происходит. Вы уже знаете, как можно передать информацию компоненту: через параметры, через точки данных и через методы (в потоке). Приоритет у них такой: сначала информация берётся из точки данных. Если на ней ничего нет, то проверяется соответствующий параметр. Если и он пуст, то только в этом случае данные берутся из потока. Всегда это помните.

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



Динамическое изменение размеров панели и самого компонента WebBrowser достигается благодаря установленнуму параметру Align. У панели оно равно caTop, то есть панель будет всега занимать положение сверху, во всю ширину окна программы. А её высоту задаёте вы в редакторе формы.

Для браузера этот параметр равен caClient. Это означает, что он займёт всю оставшуюся часть окна. Отсюда следует, что если поставить на главную форму ещё какие-то компоненты, то они будут обязательно пересекаться с этими двумя.
Но на главную форму нам ничего больше ставить не нужно. Мы будем работать с панелью.

Не забудьте войти в этот мультиэлемент (двойной щелчок). Здесь, по идее, должны располагаться кнопки навигации и адресная строка, что мы сейчас и реализуем.



Здесь для вас новый элемент - кнопка с картинкой. Он позволяет отображать на кнопке картинку, но по умолчанию вокруг кнопки рисуется рамка. Чтобы этого избежать, у кнопок изменён параметр Frame. Ну а рисунки находятся в параметре Bitmap.
Всплывающие подсказки находятся в параметре Hint.

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

Попробуйте загружать страницы. Чего-то не хватает? Ах да, конечно, статусной строки. Но и это не проблема.



В HiAsm есть и строка состояния. Она находится прямо перед дочерней формой на панели компонентов. Работать с ней несложно - в её параметре Panels нужно только указать количество ячеек, которые будут в строке, причём после названия можно ставить знак "=" и писать ширину ячейки.

В каждой ячейке может отображаться разный текст. В параметре Strings можно задать стандартные тексты и выводить их методом doIndexText, а можно и подавать произвольный текст в потоке методу doText. Мы используем именно второй способ, потому что текст заранее нам неизвестен.

А чтобы указать, в какую ячейку выводить текст, нужно подать её индекс (ячейки нумеруются с нуля!) на точку данных строки состояния Panel. Но ставить поле ввода тут ни к чему - вы ведь не хотите позволить пользователю изменить этот индекс.
Нам подойдёт невизуальный компонент Memory, в котором можно хранить данные трёх типов (строка, целое число или дробное число).



Компонент находится на вкладке "Инструменты". В его параметре Default нужно выбрать тип данных (integer - целое число) и ввести значение (первая ячейка имеет индекс 0, помните это!).

Ну а как более гибко работать с этим невизуальным компонентом, я расскажу в следующий раз.

46 комментариев:

  1. Видеоурок на примере браузера показывает, как строить интерфейс.
    По Вашему примеру зашел на Гугл - тот предложил мне установить панель Гугла. Установил. Но оказалось, что установлена она не на новосозданный браузер, а на базовый Internet Explorer.
    В связи с этим вопрос: каков статус созданной в HiAsm программы браузер в Windows? Что она может, а чего нет?

    ОтветитьУдалить
  2. Компонент WebBrowser - это только то окошко, где отображаются веб-страницы, а панель встраивается в программу. Конечно, Гугл ничего не знает о созданном вами браузере и не может "заточить" под него панель (да ему и не надо). А вот программа InternetExplorer ему известна.
    К слову: Гугл (как и Яндекс) может много чего предлагать установить, но только вам решать, надо это или нет.

    ОтветитьУдалить
    Ответы
    1. Привет, помоги пожалуйста
      У меня компонент webBrowser не работает
      Я не могу его поставить
      Не знаю что делать помоги пж

      Удалить
  3. Мне кажется, что компонент "memory" в данной схеме лишний.

    ОтветитьУдалить
  4. Столкнулся с проблемой открытия ссылок в новом окне, естественно их открывает IE. На форуме HiAsm не нашел рецепта решения этой проблемы, попал лишь на "Можно, если перехватить событие BeforeNavigate, отменить его, а затем открыть своё окно с запрашиваемым URL", но как это осуществить? Подскажите способ открывать внешние ссылки в своем интернет-браузере или в своем дочернем окне.

    ОтветитьУдалить
  5. Чтобы узнать адрес под курсором мыши, надо проверить данные, выдаваемые событием onStatus. Если первые символы равны "http", то это адрес, и его можно запоминать для дальнейшей работы. Остаётся лишь узнать, когда производится клик на ссылке. А остановить загрузку по ссылкам можно с помощью точек данных Navigate и NewWindow (находятся на вкладке "Точки").

    ОтветитьУдалить
  6. А не могли бы Вы дать схемку, которая реализует этот метод - для меня это пока не очень понятно, но необходимо.
    Спасибо!

    ОтветитьУдалить
  7. Вот полуфабрикат. Можно запретить загрузку ссылок и ловить ссылки в строке состояния. Но как узнать, что произведено нажатие в браузере - к сожалению, не знаю, потому что стандартные onMouseDown и др. не работают. Попробуйте спросить на форуме hiasm.com.

    ОтветитьУдалить
  8. а можно привязать google к поле ввода чтобы то что писал искалось через google.com

    ОтветитьУдалить
  9. Подскажите, как реализовать загрузку главной страницы при запуске браузера, через точку do navigate?

    ОтветитьУдалить
  10. Поставил между браузером и MeinForm - Case ex. Прописал в нём ссылку, подключил к on Create и к Do Navigate....На поле ввода выдаёт, а в браузер при запуске не получается.

    ОтветитьУдалить
  11. В смысле проверил на поле ввода работает, а подключил к браузеру, не хочет.

    ОтветитьУдалить
  12. Разобрался, извините за флуд, MeinForm(on creat) подключаем к Case ex потом нижней точкой к Do Navigate.

    ОтветитьУдалить
  13. Точка данных "doForward" на браузере, не работает, все остальные нормально. Версия 4.04 184...Проверял на простейшей схемке, не хочет.

    ОтветитьУдалить
  14. Да, действительно, там есть ошибка в коде компонента. Лучше всего обратиться на форум hiasm.com, чтобы оповестить об ошибке (возможно, там уже есть исправленный компонент).

    Если там никто не ответит, то просто исправьте код Webbrowser. Делается это так. Выделите компонент и нажмите Ctrl+F. Найдите там участок кода:

    procedure THIWebBrowser._work_doBack;
    begin
    if Count > 1 then
    begin
    PKOLWebBrowser(Control).GoBack;
    dec(Count,2);
    end;
    end;

    procedure THIWebBrowser._work_doForward;
    begin
    if Count < max then
    begin
    PKOLWebBrowser(Control).GoForward;
    //inc(Count);
    dec(max);
    //debug(int2str(count));
    end;
    end;

    и замените его на:

    procedure THIWebBrowser._work_doBack;
    begin
    PKOLWebBrowser(Control).GoBack;
    end;

    procedure THIWebBrowser._work_doForward;
    begin
    PKOLWebBrowser(Control).GoForward;
    end;

    Однако следует иметь в виду, что если в истории браузера не будет предыдущей/последующей страницы, то при попытке перейти назад/вперёд программа вылетает с ошибкой. Поэтому надо контролировать доступность (Enable) кнопок для этих методов в вашем коде.

    ОтветитьУдалить
  15. С форумом пока не подружился (там слишком заумные люди сидят)...исправил, заработало, Спасибо..А вот как Enabled контролировать, не пойму...Где-то должны быть временные файлы, где хранятся ссылки пока форма открыта, а как сделать, что бы, если нет инф-ии (URL) кнопка не работала...или тут как-то можно связать с запоминанием ссылок, если ты по ней переходил то "да", если "нет", то кнопка заблокированна?

    ОтветитьУдалить
  16. Наверное, придётся самостоятельно запоминать все переходы по ссылкам. Лучше всего это делать через мониторинг адреса страницы (нижняя точка CurrentURL). Если он изменился - значит, переход сделан. Но тут нужно учеться, что при переходе назад предыдущая страница не должна снова добавляться в список, т.к. она там уже есть (если вы сами запоминаете страницы переходов в списке строк). Можно использовать и счётчик для учёта переходов.

    ОтветитьУдалить
  17. А у меня нет компонента Silent =( и еще много чего, не та версия программы? HiAsm Studio 4.0 build 173

    ОтветитьУдалить
  18. Простите за тупость ,в настройках посмотрел вашу версию..

    ОтветитьУдалить
  19. Silent - это параметр компонента WebBrowser, а не компонент.

    ОтветитьУдалить
  20. если вы показали как сделать браузер -))) может покажете , как делать СЕО софт ? было бы классно , а вообще в принципе возможно ли в hiasm создание сео софта типа полу/авто комментирования блогов на DLE или WordPress с распознаванием капчи при помощи антигей итд итп -))) ну в общем такие классные штуки в HiAsm реализовать возможно !?

    ОтветитьУдалить
  21. Задержка с ответом вышла (комп сломался), но теперь отвечу. Заполнение полей форм на веб-страницах возможно, но с помощью компонента InlineCode, то есть нужно хоть немного знать delphi, а также html-разметку. Вот пример. Разобраться в нём несложно: на блоге есть статьи про IC. Следует лишь сказать, что в процедуре CreateForm (которая в IC) первым делом получаем браузер-объект, а вторым делом - загружаем в него страницу.

    Процедура Zap заполняет поля. author, email, url, comment - это всё id тегов input на странице блога, которые и нужно заполнить. Выполнение процедуры заполняет эти поля.

    Ну если хочется автоматизировать и отправку, то строка
    PKOLWebBrowser(WB).OleObject.Document.getElementById('submit').click;
    как раз делает это, только нужно убрать слэши пред ней.

    Однако всё будет работать только для стандартным форм комментариев в блогах. Если владелец блога установил что-то нестандартное, то у полей вполне могут быть другие id, и тогда придётся приспосабливаться к каждому конкретному случаю.

    Что касается капчи, то разные блоги используют разные капчи, и как её распознавать - тут моих знаний явно не хватает.

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

    ОтветитьУдалить
  22. А возможно сделать в браузере кнопку, которая запускала бы exe файл например по пути %Program Files%1\2.exe , или просто с ярлыка на рабочем столе?

    ОтветитьУдалить
  23. Конечно, можно. Для этого есть компонент WinExec на вкладке "Система". Он запускает программы и открывает файлы.

    ОтветитьУдалить
  24. спасибо большое за ответ , я в HiAsm - новичок, но буду стараться развить свои навыки , не только в HiAsm , но и в программировании в целом т,к есть необходимость создания своих собственных СЕО инструментов , и если у меня возникнут вопросы по hiasm , я сразу же к вам обращусь -)))

    ОтветитьУдалить
  25. "Конечно, можно. Для этого есть компонент WinExec на вкладке "Система". Он запускает программы и открывает файлы."

    Спасибо, всё оказалось просто, Только вот, если я захочу с другого комп-ра запуститься, где система и ехе файл стоит на др. диске, т.е путь тот же, но диск с др. буквой. Можно как то получить путь?

    ОтветитьУдалить
  26. Для этого, разумеется, нужно знать букву диска. Если нужно узнать, где установлена система, то можно воспользоваться компонентом Dir на вкладке "Файлы". Нижние точки компонента содержат путь к разным системным папкам, из них можно и диск узнать. Отделить букву диска можно компонентом StrPart со вкладки "Строки". У него надо установить разделитель "\" (без кавычек).

    ОтветитьУдалить
  27. Отлично, далее через формат строк к WinExec и всё работает. Спасибо!

    ОтветитьУдалить
  28. как установить компилятор Delphi в HiAsm версии 4.04

    ОтветитьУдалить
  29. Сначала надо установить сам HiAsm. Хотя вроде бы в последних версиях компилятор идёт в комплекте с самим HiAsm. Но компилятор можно скачать отдельно (hiasm.narod.ru/Compiler.exe).

    ОтветитьУдалить
    Ответы
    1. Http://Не найдено!!!
      Вот здесь можно найти "http://vk.com/hiasm"

      Удалить
  30. Вот файл:
    --------------------------------------------------------------------------
    | "http://www.fayloobmennik.net/3759914" |
    --------------------------------------------------------------------------
    Я так и не понял как сделать так чтобы в браузер ссылка на новое окно было заменено на открытие ссылки в этом же окне...
    Т.е. Пользователь нажимает на любую ссылку и она открывается в этом же браузере(окне)...
    Помогите пожалуйста!
    "Пытался использовать некоторые варианты - не получилось."

    ОтветитьУдалить
  31. Добрый день. Как выводить код html в тексте или в редакторе?

    ОтветитьУдалить
  32. Мне нужно достать исходный код сразу в редактор. Как провести данную операцию? точки не выдают исходный код.
    Спасибо.

    ОтветитьУдалить
    Ответы
    1. Вот два варианта загрузки кода страницы. Один через браузер, другой - в фоне.
      Add(Button,7784470,175,189)
      {
      Left=5
      Top=10
      link(onClick,3686687:doData,[])
      }
      Add(WebBrowser,5965895,231,133)
      {
      Left=5
      Top=40
      }
      Add(DoData,3686687,238,189)
      {
      link(onEventData,9537061:doWork2,[])
      link(Data,5965895:Page,[])
      }
      Add(Memo,8635596,378,168)
      {
      Left=5
      Top=165
      Width=200
      Height=95
      }
      Add(Button,13905010,175,294)
      {
      Left=215
      Top=10
      link(onClick,11496708:doDownload,[])
      }
      Add(HTTP_Get,11496708,231,294)
      {
      link(onDownload,1647489:doConvert,[])
      }
      Add(Convertor,1647489,280,301)
      {
      Mode=11
      link(onResult,9537061:doWork3,[(347,307)])
      }
      Add(HubEx,9537061,343,189)
      {
      link(onEvent,8635596:doText,[])
      }

      Удалить
  33. Не могу разобраться с поиском текста searchinfile,ввожу слово,символ,цифру,не выводит ничего в редактор текста.Как найти нужный текст из потока,либо из файла? Заранее спасибо!

    ОтветитьУдалить
    Ответы
    1. Выделите компонент и нажмите F1 - в справке есть отличный пример.

      Удалить
  34. Скажите пожалуйста, как установить фокус на конкретный элемент в браузере? для получения информации с нужной области на странице.
    Спасибо.

    ОтветитьУдалить
    Ответы
    1. Для этого нужно знать компонент InlineCode и работать с DOM-структурой. Вот один из вариантов:
      http://rusfolder.com/43801984

      Посмотрите код - разберитесь. Что непонятно - спрашивайте.

      Удалить
  35. А почему при загрузке https://www.darkorbit.ru выдает ошибку сценария Script error?, как ее убрать?

    ОтветитьУдалить
    Ответы
    1. В свойствах элемента "Браузер" в пункте "Silent" поставить "True"

      Удалить
  36. Подскажите пожалуйста как с помощью этого элемента авторизоваться на сайте? Authorization: Basic root:root
    Весь вечер мучаюсь. Спасибо.

    ОтветитьУдалить