Synapse в Delphi

Источник: delphi
Вадим К.

Вступление

Часто, чтобы раскритиковать программистов на Delphi, используют простой и дешёвый трюк. Мол, мы, истинные программисты пишем весь код ручками, а вы, делфисты, набросали компонентов и всё.

На самом деле весь код ручками пишут только фанатики и те, кому нечего делать. А нормальные программисты используют готовые библиотеки. Компоненты Delphi на самом деле тоже являются самыми настоящими библиотеками, просто написаны с учётом некоторых особенностей Delphi.

Но доказывать это им бессмысленно - всё равно будут сопротивляться (чтобы они согласились?). Мы пойдём другим путём - будем использовать самую что не наесть библиотеку - и пусть медитируют себе.

В качестве примера я представляю библиотеку Synapse (http://synapse.ararat.cz/doku.php). По возможностям эта библиотека соответствует популярным Indy, только стабильность у неё получше. К примеру, почту с вложениями отправлять/принимать или файлы по https качать на ней проще простого. А вот с Indy нужно хорошо помучаться.

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

Установка библиотеки

Для начала нужно скачать библиотеку с сайта. Или просто взять в прилагаемом к статье архиве. Теперь распакуем куда-нибудь во временный каталог. Создадим папку, где будет располагаться сама библиотека - у меня это обычно каталог C:\Program Files\CodeGear\Components\Synapse. То есть, я, не стесняясь, создаю каталог в каталоге Delphi, и ставлю туда свои библиотеки/компоненты. Хотя некоторые сочтут это идеологически неверным - можно создать каталог для библиотек и в любом другом месте, главное, чтобы его потом не удалили. Второе условие - чтобы путь содержал только латинские символы. Иначе бывают проблемы с некоторыми компонентами. Один из посетителей сайта www.delphi.int.ru делает оригинально - он хранит всё это прямо на рабочем столе. А потом ругается, мол, ничего не работает.

Скопируем в новосозданную папку содержимое папки source\lib из распакованного архива.

Остался последний шаг - объяснить Delphi, что у нас есть новая библиотека. Для этого просто нужно прописать каталоги для поиска.

В случае с Delphi 2006-2007 это делается так:

  • File -> Close All. При надобности сохраните текущий проект (это страховочное действие, не помешает).
  • Tools -> Options. В появившемся диалоге в дереве слева находим Environment options -> Delphi Options -> Library - Win32.
  • Ищем поле Browsing path. Жмём кнопку […] справа от него.
  • В появившемся окне ищем снова кнопку […] и, нажав её, выбираем каталог, куда сохранили содержимое библиотеки и жмём ОК.
  • Теперь Add и ОК для закрытия окна.
  • Повторяем предыдущие три действия, только для поля Library Path.

Если же у вас Delphi 7 или младше, то нужно в меню Tools найти пункт Environment Options, а потом вкладку Library. Всё остальное - очень похоже.

Сделай это по-простому

Так, библиотека установлена, пора написать что-то простенькое. Например, научимся скачивать страничку из интернета и отображать в Memo. Создаём новый проект, Ставим на форму Memo, растянем нормально и включим полосы прокрутки установкой свойства ScrollBars = ssBoth. Ставим на форму кнопку, кликая дважды по ней, создаём обработчик. Но перед написанием обработчика, надо добавить один юнит в список uses, а именно - httpsend.

А теперь сам обработчик. Приготовились увидеть сверхсложный код? Вот он - одна строчка:

HttpGetText('http://вашсайт.нет', Memo1.Lines);

Не правда ли просто? Но на самом деле, лучше написать немного сложнее:

if not HttpGetText('http://вашсайт.нет', Memo1.Lines) then
  ShowMessage('Не получилось скачать:('); 

Этот код нужен только для контроля ошибок, но это часто важно. Интересно, что если страничку не удастся скачать, то никаких ошибок не будет, просто функция возвратит false. Иногда очень удобно, особенно в потоках.

Замечателен и следующий факт. Так как библиотека является лёгкой обёрткой над обычными сокетами, то это сказывается на размере выполняемого файла. Этот же пример, переписанный с использованием Indy весит на 30% больше - а это весомый аргумент (если быть точнее, то в цифрах два исполнимых файла у меня весили 404 и 530 кбайт).

А посерьёзнее?

А теперь усложним задачку. Предположим, надо скачать файл/страницу с ресурса, использующего SSL. В случае с Indy это сделать очень сложно. Точнее, написать приложение-то просто, но вот чтобы оно работало... Оно или требует библиотеки OpenSSL, или говорит, что найденные библиотеки не подходят. Решается проблема скачиванием "правильных версий библиотек". Но даже имея их, всё равно проблемы. Если какое-то приложение использовало "неверные библиотеки", то до перезагрузки компьютера работать ничего не будет. Или то грузится, то нет. Почему так - предположения есть, но не хочется разбираться. Есть дела поважней.

Итак, что надо сделать для решения нашей "сложной" задачи? Первым долгом убедиться, что в системном каталоге есть файлы ssleay32.dll и libeay32.dll. (для тех, кто не нашёл, я в архиве приложил их). Рекомендуемая версия - не меньше 0.9.7. В архиве - 0.9.8.2. Если "загрязнять" системный каталог (C:\Windows\System32) не хотите, то можно просто рядом с приложением положить эти файлы.

А теперь осталось сделать в нашей миниатюрной программе одно изменение - добавить в список uses файл ssl_openssl. И всё. Теперь можно скачивать как с http, так и с https. Библиотека сама разберётся со всем!

Хочу пример сложнее!

В качестве рабочего приложения хочу представить маленькую программу для получения whois информации. Whois сервер - это сервер, который по ip или имени домена выдаёт некоторую информацию о его принадлежности. Например, владельца, город/страну, где расположен сервер. Но для "повышения секретности" мы будем использовать сайт https://www.nic.ru/whois/, который может предоставлять эту информацию по SSL.

Сам код смотрите в приложенном архиве.

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

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

В целом, в коде нет ничего сверхсложного, и я не считаю нужным объяснять его. Просто посмотрите и всё поймете.

Заключение

Помните, что когда решение задачи начинает слишком усложняться - значит вы выбрали неверный способ решения, не более. Один мой знакомый, пытаясь скачать страничку по https, и промучавшись несколько дней, на моё предложение использовать Synapse, сказал: "Нет, хватит с меня, ещё одно. Лучше я напишу на чистых сокетах. Надоели эти поделки. Моё будет работать". Кстати, пишет он уже несколько недель :-) и ругает кривой Windows, который ему постоянно мешает. Но мы-то знаем, где правда.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=22206