Лекция: Лекція № 12
Для следующего примера нам придется расширить возможности Delphi. Те компоненты, которые доступны на палитре — это только основа. Вы можете расширять их количество и качество по своему усмотрению. Для этого в сети Интернет много библиотек компонентов, которые можно подключать к Delphi. Среди них есть платные, а есть и бесплатные, которые по качеству не отличаются даже от родных, написанных и Borland.
Сейчас мы напишем собственную утилиту Ping. Для ее написания нам понадобится очень сильная и бесплатная библиотека Internet Component Suite (ICS). Ее вы можете найти по адресу www.rtfm.be/fpiette/indexuk.htm или на компакт-диске к книге в директории Компоненты\Internet\ICS. Скопируйте файлы себе на диск, например в C:\components, разархивируйте их — скоро они вам пригодятся.
Теперь запустите Delphi. Как всегда, при запуске будет создан новый проект. Он нам пока не нужен, поэтому закройте его (File\Close All), Теперь нужно открыть с помощью Delphi библиотеку, которую вы скачали из сети или взяли на компакт-диске. Файл, который надо открыть, называется IcsdelXX.dpk, где XX— номер версии установленного у вас Delphi. Если у вас стоит Delphi 6 или Delphi 7, то можно открыть Icsclel50.dpk. В библиотеке нет файлов для этих версий, но 5-й установится без проблем.
Рис. 4.13. Окно библиотеки компонентов
Когда вы откроете библиотеку, перед вами появится окно, как на рис. 4.13. В этом окне нажмите кнопку Install, чтобы Delphi откомпилировал пакет и пpoинсталлировал его.
Если вы все сделали правильно, то должно появиться окно с перечислением новых установленных компонентов (рис. 4.14).
Рис. 4.14. Установка завершена
Теперь нужно указать Delphi, где находятся файлы пакета, чтобы он мог при компиляции проектов найти все необходимое. Для этого выберите в меню Tools пункт Environment Options. Перед вами появится окно настроек Delphi, Перейдите на вкладку Library (рис. 4.15).
Рис. 4.15. Настройка Delphi
Щелкните на кнопке с тремя точками напротив строки Library path, и вы увидите окно, как на рис. 4.16. Внизу окна есть строка ввода. Введите туда путь к директории, куда вы разархивировали пакет (у меня это C:\componcnts\ Delphi\Vc32). Нажмите кнопку Add. Теперь можно закрывать все открытые окна, нажимая многочисленные ОК.
Рис. 4.16. Добавление директории пакетов
На компонентной палитре появилась новая закладка FPiette. Все компоненты этой библиотеки очень быстрые и достаточно хорошие. Единственный обнаруженный мной недостаток — глючит компонент FTPClient.
Рис. 4.17. Закладка FPiette
Все необходимые компоненты установлены, так что теперь переходим к программированию. Опять закройте все окна, и на вопросы о сохранении изменений в пакете отвечайте Да. Создайте новый проект. Перемесите на форму два компонента TLabel и два TEdit. Разместите их так, как показано на рис. 4.18.
У Label1 измените свойство Caption на «Имя компьютера», а у Iabel2 — на «Размер пакета». Напротив Label1 должен стоять Edit1. Сюда вы будете вводить IP-адрес или имя компьютера, который надо пропинговать. В Edit2 будем вводить размер пакета.
Еще не помешает перенести на форму компонент RichEdit с закладки Win32, и него мы будем записывать результат выполнения опеции. И наконец, разместите на форме компонент ping с закладки FPiette, который и будет производить пинг (рис. 4.19).
Рис. 4.18. Форма будущей программы
Рис. 4.19. Свойства компонента Ping
Все, форма готова. Осталось только написать код, которого не так уж и много.
Создайте обработчик события onclick кнопки. Там нужно написать следующее:
procedure TPingForm.Button1Click (Sender: TObject)
begin
RichEdit1.Lines.Add('Поиск''' + Edit1.Text + '''');
Ping1.Size:=StrToInt(Edit2.Text);
Ping1.DnsLookup (Edit1.Text);
end;
Здесь первой строкой через компонент RichEdit выводится сообщение о начале пинга. Вторая строка устанавливает размер пакета пинга (ping1.size), как указано в Edit2, Последняя строка запускает поиск компьютера через DNS (ping1.DnsLookup). Даже если вы введете IP-адрес, поиск в базе DNS ничего плохого не сделает.
Теперь выделите компонент Ping1 и создайте для него обработчик события OnDnsLookupDone (когда закончен поиск в базе DNS). Здесь напишите следующее:
procedure TPingForm.Ping1DnsLookupDone (Sender: TObject; Error: Word)
begin
//Если произошла ошибка, то...
if Error <> 0 then
begin
//Вывести сообщение об ошибке
RichEdit1.Lines.Add('Хост не найден ''' + Edit1.Text + '''');
//Выход
Exit;
end;
//Если ошибок не было, то выводим в RichEdit1 результат поиска
RichEdit1.Lines.Add('Хост ''' + Edit1.Text +''' — '+Ping1.DnsResult); //Устанавливаем //свойство Address компонента Ping равным адресу, найденному в базе DNS
Ping1.Address:= Ping1.DnsResult;
//Запускаем Ping
Ping1.Ping;
end;
Чтобы легче было разобраться с его содержимым, листинг снабжен комментариями. В этой процедуре ничего сложного нет, и комментариев будет достаточно для понимания происходящего.
Нам еще нужно выловить результат пинга. Для этого создайте обработчик события OnEchoReply для компонента Ping1:
procedure TPingForm.Ping1EchoReply(Sender, Icmp: TObject; Error: Integer)
begin
if Error <> 0 then
RichEdit1.Lines.Add ('Не могу выполнить операцию ping: ' + Ping1.ErrorString)
else
RichEdit1.Lines.Add('Получено '+intToStr(Pingl.Reply.DataSize)
+' байт от '+Ping1.HostIP + ' за ' + IntToStr(Ping1.Reply.RTT) + ' миллисекунд');
end;
Здесь выводится результат пинга. Если Error не равно 0, то показывается сообщение об ошибке. Если равно, то показывается время, за которое прошел ping.
И напоследок проведем косметическую операцию. Создайте обработчик события OnEchoRequest для компонента ping1. В нем напишите следующее:
procedure TPingForm.Ping1EchoRequest(Sender, Icmp: TObject)
begin
RichEdit1.Lines.Add('Посылка' + IntToStr(Ping1.Size) + ' байтов на ' + Ping1.Hostname);
end;
Это чисто косметическая поправка, которая вводит состояние пинга. Событие onEchoRequest происходит тогда, когда пакет отправляется на удаленную машину. Это событие вылавливается и выводится сообщение о том, что сейчас отправляются данные в определенном размере на машину с указанным адресом. Так информация будет лучше восприниматься, и с ней легче будет работать.
Рис. 4.20. Результат работы утилиты Ping
Теперь в вашем арсенале появилась еще одна утилита собственного изготовления, которая обязательно должна присутствовать у любого компьютерщика, хоть как-то связанного с сетью.
Для чего нужен пинг? Часто возникает вопрос: «Как узнать IP-адрес сервера?» Самый простой способ сделать это — ping. Просто пингуешь символьное имя сервера, а ваша утилита сразу показывает нам его IP-адрес.
Лекція № 12