Раздел "Кодинг". Содержание:
Статьи:
Создание Web-приложений в среде Delphi
Delphi и Flash. Совмещение несовместимого!
Работа с HTTP протоколом в Delphi
Раздел "Кодинг". Статьи:
| Создание Web-приложений в среде Delphi |
|
Эпоха web-дизайна, когда наиважнейшим считалось возможность
запихнуть на страницу как можно больше графики и поразить
пользователя широтой фантазии дизайнера, канула в лету. В моде -
информационный дизайн и всяческие удобности для пользователя. Плохим
тоном уже считается одно только то, что на сайте нет форума или
гостевой книги, и самое ужасное - о, боже - вы до сих пор верстаете
каждую страницу вручную, вместо того, что бы поручить сеё скучное и
утомительное занятие скрипту.
Время первопроходцев HTML в скором времени закончится и вовсе, и
их место займут профессионалы-программисты. Именно программисты, ибо
уже в большей степени от их умения создать удобный в использование
сайт зависит его успех. Кроме прочего, теперь сайты создают совсем
уж как программные продукты: тем кто занят наполнением содержанием,
уже может не опасаться запутаться в html, java, cgi и прочих
ипостасях интернет-технологий - администрирование сайта становится
таким же привычным и удобным, как работа с текстовыми процессорами.
Пока, правда, ощущается явный недостаток законченных продуктов, на
плечи которых можно было бы возложить все функции по поддержанию
сайта в актуальном состоянии, оставив себе лишь вопросы по
наполнению его содержанием.
Пока же тяжкое бремя по созданию данных систем, на основе которых
будет функционировать сайт, ложится на плечи программистов, только
вот-вот успевших изумится возможностями языка Perl или Java. И
многие из них, сказать без преувеличения, вышли, словно из
гоголевской "Шинели", из Delphi. Действительно, данная среда
разработчика, предоставляющая удобный интерфейс для визуального
программирования и широкие возможности Object Pascal, столь мила
сердцу российских программистов.
Но, похоже, что времена меняются, и Delphi из среды создания
обычных настольных приложений, может сгодиться и в другом плане: для
написания прикладных web-программ. И действительно, что может быть
лучше: уже знакомая среда разработки, вдоль и поперек изученный
язык, да и достаточно широкий круг специалистов по программированию
в Delphi - это ли не плюсы создания web-приложений на Delphi. Есть
конечно и минусы: созданные программы вряд ли смогут удовлетворить
тех, кто считает, что лучший web-сервер, это сервер не от Microsoft.
Но что поделаешь - версия Delphi под Unix отложена пока до лучших
времен. Зато посудите сами: перенос программ в будущем светлом
будущем можно будет совершить с малой кровью.
Но отложим пока теорию в сторону, и обратимся к практике. Итак,
создание web-приложения в среде Delphi, что называется шаг за шагом.
Пример из учебника
В отличие от прочих аспектов создания приложений в Delphi, о
создании приложений для web написано мало. Так ужасающе мало, что из
книги в книгу, из учебника в учебник путешествует один и тот же
пример. Не будем оригинальничать и мы - чем проще, тем лучше.
Вообще, простейшее web-приложение на Delphi мало чем отличается,
а точнее ничем не отличается от создания программы для старой доброй
DOS. Это - простейшее консольное приложение, запускаемое на стороне
сервера и взаимодействующие с пользователем (в случае необходимости)
через броузер.
Создайте в Delphi новый проект - ту самую уже давно забытую всем
Console Application. Вы получите знакомый со школьной скамьи, текст
обычной паскалевской программы:
program primer;
{$APPTYPE CONSOLE}
uses SysUtils; begin
// Insert user code here
end.
Далее еще проще. Организуем вывод кода HTML с помощью команды writeln.
writeln ('CONTENT-TYPE: TEXT/HTML');
writeln;
writeln ('<html>');
writeln ('<head>');
writeln ('<meta HTTP-EQUIV="Content-Type" Content="text-html; charset=windows-1251">');
writeln ('<title>Delphi the best facility for making web-publications!</title>');
writeln ('</head>');
writeln ('<body bgcolor="white">');
writeln ('Hello, world!');
writeln ('</body>');
writeln ('</html>');
Обратите внимание на строку CONTENT-TYPE: TEXT/HTML, которая определяет описание последующего содержимого, а именно кода HTML. После CONTENT-TYPE: TEXT/HTML, необходимо вывести пустую строку иначе броузер может выдать сообщение об ошибке.
Теперь, когда приложение закончено, осталось его скомпилировать и проверить. Для проверки работоспособности программы вам понадобиться веб-сервер. Можно особо не утруждаться, подойдет любой, даже стандартный домашний веб-сервер от Microsoft. Приложение надо будет разместить в папке публикаций сервера (обычно это - C:\Inetpub\ wwwroot) и запустить сам сервер. Теперь, если вы перейдете по адресу http://localhost/primer.exe в броузере, вы должны увидеть результат действия данной программы - строку Hello, world! Вот и всё, простейшее web-приложение на Delphi готово.
Передача параметров
На самом деле нам бы вряд ли понадобилось Delphi, для создания подобных программ. Конечно, можно генерировать страницы исходя из различных условий, но вопрос в том, как данные условия передать программе. И здесь оказывается не всё так сложно, достаточно вспомнить передачу параметров приложению с помощью командной строки и поступить соответствующе. Хотя это, разумеется, хитрость. Это для приложения Delphi мы оперируем командной строкой, для пользователя же это адресная строка в броузере, то есть url.
Попробуем на примере. Необходимо создать приложение, которое выдает различную информацию (к примеру, время, дату или то и другое вместе) в зависимости от параметров, указанных в адресной строке броузера. Как известно, за данные в параметрах отвечают такие функции, как ParamCount и ParamStr. Их-то мы и будем использовать.
program CgiDate; {$APPTYPE CONSOLE} uses SysUtils; begin
writeln ('CONTENT-TYPE: TEXT/HTML');
writeln;
writeln ('<HTML><HEAD>');
writeln ('<TITLE>Cgidate</TITLE>');
writeln ('</HEAD><BODY>>');
writeln ('<H1>Пример передачи параметров</H1>');
writeln ('<HR>');
writeln ('<H4> if ParamCount >0 then
begin
if ParamStr (1) = 'date' then
writeln (FormatDateTime('"Сегодня " dddd, mmmm d, yyyy', Now))
else if ParamStr (1) = 'time' then
writeln (FormatDateTime('"Время" hh:mm:ss AM/PM', Now))
else if ParamStr (1) = 'both' then
writeln (FormatDateTime('"Сегодня " dddd, mmmm d, yyyy,'
+ '"<p> и время" hh:mm:ss AM/PM', Now))
else
writeln ('Ошибка! Неверный параметр: ' + ParamStr (1) + '.')
end
else
writeln ('Параметр отсутствует.');
writeln ('</BODY></HTML>');
end.
Не правда ли просто? Теперь, если в адресной строке броузера вы наберете, например http://localhost/cgidate/exe?time, будет сгенерирована страница, отображающая текущее время, http://localhost/cgidate/exe?date - соответственно дата, а при передаче параметра both - текущая дата и время. В случае если никакой из параметров передан не был или он был ошибочен - возникнет сообщение об этом.
Данные адреса и параметры можно непосредственно указать в коде HTML и генерировать необходимые изменения на странице либо другие страницы переходя по соответствующим ссылкам.
Следует обратить внимание на то, как передавать данные через url. Знак вопроса отделяет параметр от адреса файла, с помощью знака равенства web-приложению передается значение данного параметра. Так как в адресной строке нельзя использовать пробел, он заменяется на шестнадцатеричный код в таблице ASCII, то есть %20.
Но на самом деле, если некие данные передаются от пользователя web-приложению, то обычно для этого используют формы, а не url (хотя одно другому не мешает). Попробуем и мы создать приложение, которое бы получало данные от пользователя, занесенные им в форму.
Для начала, естественно, нужно создать сам код HTML в котором бы присутствовала форма с полями ввода, кнопкой отправки и прочими необходимыми атрибутами. При этом form action должен содержать адрес программы, которая будет получать данные. Значение method может быть равно как GET, так и POST. На самом деле GET - это и есть передача параметров через url, добавляя их к адресной строке, так как POST передает их приложению посредством стандартного потока ввода. Какой из них лучше и удобней - решать вам, но чаще всего метод GET используется именно для генерации страниц (достаточно взглянуть на url который возникает при работе на поисковых серверах), тогда как второй для - передачи данных, отображать которые в адресной строке было бы весьма накладно.
Затем необходимо создать приложение, которое бы адекватно смогло воспринять все эти данные со стороны пользователя. В случае если данные передавались с помощью метода GET проблем не будет - можно действовать как в предыдущем примере. Если же приложение получает данные от пользователя с помощью POST, всё несколько иначе.
Необходимо будет считывать данные из переменной окружения, а для этого мы, естественно, должны знать данные переменные.
Гюльчитай, открой личико
Нет в мире тайн. Особенно их мало у пользователя от web-приложения. И если мы не знаем о пользователе кое-что личное, все прочее броузеры с легкостью отдают web-серверу, нисколько не заботясь о приватности и желаниях того самого пользователя. Это, конечно, нехорошо для пользователя, но хорошо для разработчика web-приложения, поскольку для него знания - великая вещь.
Итак, данные от пользователя web-приложению можно передать через переменные окружения. Вот список наиболее часто употребляемых: GATEWAY_INTERFACE Поддерживаемая версия CGI.
REQUEST_METHOD Метод запроса, может быть как GET так и POST.
HTTP_REFERER Адрес страницы (url), активирующей текущее приложение на web-сервере.
PATH_INFO Путь переданный приложению расположенный между именем приложения и строкой запроса.
QUERY_STRING Строка запроса, если метод - GET, добавляеться к url.
REMOTE_HOST Имя хоста удаленного пользователя.
REMOTE_USER Имя удаленного пользователя.
REMOTE_IDENT IP-адрес удаленного пользователя.
HTTP_USER_AGENT Имя и версия броузера удаленного пользователя.
С помощью данных переменных можно получить исчерпывающую
информацию о пользователе и передаваемых данных для верного
проектирования вашего web-приложения. Конечно, этого хватит в том
случае, если вы не собираетесь подобно Большому Брату следить за
каждым телодвижением пользователя.
Но вернемся к поставленной задаче - передаче данных приложению от
пользователя через форму. Данные, которые передаются через QUERY_STRING в приложение с помощью метода POST, достаточно просто
извлечь для использования.
Ниже листинг программы, выдающий список некоторых переменных
окружения и их значения. Узнайте кое-что о своем броузере и
web-сервере.
program CgiVars; {$APPTYPE CONSOLE} uses
Windows;
сonst
VarList: array [1..17] of string [30] =
('SERVER_NAME', 'SERVER_PROTOCOL',
'SERVER_PORT', 'SERVER_SOFTWARE',
'GATEWAY_INTERFACE', 'REQUEST_METHOD',
'PATH_TRANSLATED', 'HTTP_REFERER',
'SCRIPT_NAME', 'PATH_INFO',
'QUERY_STRING', 'HTTP_ACCEPT',
'REMOTE_HOST', 'REMOTE_USER',
'REMOTE_ADDR', 'REMOTE_IDENT',
'HTTP_USER_AGENT'); var
I: Integer;
ReqVar: string;
VarValue: array [0..200] of Char; begin
writeln('Content type: text/html');
writeln;
writeln('<HTML><HEAD>');
writeln('<TITLE>CGI Variables</TITLE>');
writeln('</HEAD><BODY>');
writeln('<H1>CGI Variables</H1>');
writeln('<HR><PRE>'); for I := Low (VarList) to High (VarList) do
begin
ReqVar := VarList[I];
if (GetEnvironmentVariable (PChar(ReqVar),
VarValue, 200) > 0) then
else
VarValue := '';
writeln (VarList[I] + ' = ' + VarValue);
end;
writeln('</PRE></BODY></HTML>');
end.
За кадром
В этой статье мы не коснулись другой и уж наверняка более
обширной и сложной темы, как создание ISAPI-приложений на Delphi.
Вышеприведенные способы создания приложений годны лишь в том случае,
если вам необходимо быстрое, компактное и не слишком сложное
web-приложение. Если же вам необходим, к примеру, доступ к базам
данным, то подобный путь неприемлем.
Для создания полномасштабных приложений для интернета в Delphi
существует специальный помощник - Web Server Application. С его
помощью можно создать приложение генерируещее динамические
web-страницы, основанные на CGI, NSAPI или ISAPI. Единственное
накладываемое ограничение - непосредственно web-сервер должен
работать на базе Windows.
Одним из главных преимуществ создания подобных приложений именно
в среде Delphi является то, что вы продолжаете работать с
визуальными компонентами - это значительно проще, чем создание
приложений в других средах - возможность ошибки в больших проектах,
где используется визуальное проектирование меньше, чем в тех, где
всё описывается исключительно кодом. Кроме того, средства создания
web-приложений позволяют импортировать уже существующие приложения в интернет-среду, что, согласитесь, немаловажно. Пока, конечно, Delphi
не обладает большим набором компонентов для web-приложений, но,
видимо, уже следующая версия этой среды обзаведется необходимыми. Но
и сейчас Delphi можно считать достаточно удобным инструментом для
создания приложений, взаимодействующих с интернетом.
| Delphi и Flash. Совмещение несовместимого! |
|
Разве возможно совместить Флэш-ролики и
Дельфи-приложения. Раньше я думал что
НЕТ. Но теперь я знаю не только, что это
возможно, но и знаю как это делается!!! И
сейчас я вам расскажу об этом. Во-первых
хочется отметить преимущества
использования флэш-роликов в ваших
программах. Если вы сумеете гармонично
вписать небольшой флэш-ролик в вашу
программу, то несомненно внешний вид
программы будет намного
привлекательнее (главное не
переборщить, увлекаясь дизайном, не
надо забывать о том что программа
должна быть удобна и проста в
использовании!).
Итак, как
же совместить Флэш и Дельфи? (Надеюсь,
что у вас Флэш установлен:))
Запустите
Дельфи и выберите пункт меню Component->Import
ActiveX Control... Перед вами откроется
диалоговое окно с заголовком Import ActiveX Control.
В разделе Registered Controls выберите Shockwave Flash.
В разделе Pallete Page... Выберите страницу в
палитре компонентов, на которой будет
располагаться установленный компонент
(по умолчанию это ActiveX). В разделе Unit Dir Name...
путь к папке куда будет установлен
компонент.
Нажмите
на кнопку Install. Перед вами появится окно,
в котором вам нужно будет выбрать в
какой пакет будет установлен компонент
(вы можете установить как в уже
существующий, так и в новый пакет).
Затем перед вами появится окно
редактирования выбранного пакета и
Дельфи вас спросит: "...Package will be rebuilt. Continue?".
Ответьте Yes. Все готово теперь можно
использовать флэш в ваших приложениях!!!
Теперь,
чтобы показать вам как пользоваться
этим компонентом, попробуем вместе
сделать программу для просмотра *.SWF
файлов. Для этого нам понадобятся
следующие компоненты: TShockwaveFlash (для
удобства назовите его просто Flash1), TTrackBar,
TTimer, TOpendialog и три кнопки TButton ("открыть",
"старт" и "стоп").
Для начала установим необходимые свойства OpenDialog'a
- Свойство Filter может быть таким: Флэш-ролики|*.swf
- Свойство DefaultExt должно быть: *.swf
Для Timer'a нужно установить свойство Interval равным 1.
Для TShockwaveFlash:
- Name сделайте равным Flash1
- Свойство Playing установите в false
- Свойство BGColor, установите
как вам хочется (цвет фона)
Теперь напишем обработчик
события OnClick для кнопки, которая
вызывать OpenDialog:
if open1.Execute then begin
flash1.Movie:=open1.FileName;
trackbar1.Max:=flash1.TotalFrames; {это делается для
того, чтобы потом можно было перемещаю
ползунок посмотреть каждый кадр ролика}
В обработчик события OnClick для
второй кнопки ("Старт") напишем:
flash1.Play;
Ну тут вообще все просто! Почти
таким же образом это будет выглядеть
для третьей кнопки ("Стоп"):
flash1.Stop;
Теперь сделаем, чтобы при
перемещении ползунка Trackbar'a мы могли
посмотреть каждый кадр (событие OnChange):
if Flash1.IsPlaying=true then Flash1.Stop; {если
ролик проигрывается, то надо его
остановить}
flash1.GotoFrame(trackbar1.position); {открываем кадр
номер которого соответствует позиции
ползунка}
Ну и наконец осталось сделать
чтобы при проигрывании ролика ползунок
перемещался, указывая сколько осталось
и сколько прошло. Для этого то мы и
используем Timer. В обработчик события OnTimer, напишем:
trackbar1.Position:=flash1.CurrentFrame;
Приведу полный код приложения:
unit flash;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, OleCtrls, ShockwaveFlashObjects_TLB, ExtCtrls;
type
TForm1 = class(TForm)
Flash1: TShockwaveFlash;
Button1: TButton;
TrackBar1: TTrackBar;
Open1: TOpenDialog;
Button2: TButton;
Button3: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
if open1.Execute then begin
flash1.Movie:=open1.FileName;
trackbar1.Max:=flash1.TotalFrames;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
flash1.Play;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
if Flash1.IsPlaying=true then Flash1.Stop;
flash1.GotoFrame(trackbar1.position);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
flash1.Stop;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
trackbar1.Position:=flash1.CurrentFrame;
end;
end.
Ну вот и все. Как оказалось, ничего сложного.
| Работа с HTTP протоколом в Delphi |
|
В связи с все большим вниманием, которое привлекает к себе Интернет, все больше людей становятся заинтересованы в сетевых технологиях. Данная статья посвящена программированию на Borland Delphi с использованием одного из самых популярных Интернет-протоколов - HTTP.
А именно, здесь мы рассмотрим компонент TNMHTTP (NetMasters HTTP), который можно обнаружить на вкладке FastNet палитры компонентов Дельфи.
Начнем с теории. Если Вы уже знаете, что такое HTTP и зачем он нужен, то пропустите следующий раздел.
Зачем нужен HTTP
Итак, где же используется HTTP? Если Вы хотя бы чуть-чуть
заглядывали на Интернет-странички и встречались с термином
Web, то наверняка обратили внимание на то, что адреса
страничек, как правило, начинаются с http://. Протокол HTTP
(HyperText Transfer Protocol) позволяет принимать и посылать
не только гипертекстовые документы (типа html), но и любые другие
(тексты (txt), изображения (gif, jpg), и т.д.). Ниже приведены
типовые задачи, для выполнения которых необходимо использовать
HTTP:
- Браузеры - программы, позволяющие просматривать Интернет-странички;
- Скачивальщики - программы, позволяющие скачивать из Интернета странички, рисунки и другие документы;
- Чаты - программы, позволяющие общаться по сети. Часто документы HTTP используются для хранения сообщений (как, например,
в конференциях).
- Это лишь список некоторых из стандартных направлений программирования с использованием HTTP. Вы можете применять этот протокол для любых своих целей. Например, автоматические системы обновления данных, посылка запросов в Интернетовские базы, и еще множество всяческих других возможностей!
Краткое описание свойств, методов и событий
Ниже приведена таблица, содержащая наиболее краткое описание основных свойств, методов и событий компонента TNMHTTP:
Свойства
Body -
строка, содержащая либо путь к файлу, в который будет записано
тело http-документа (если св-во InputFileMode равно
True), либо непосредственно само тело (если св-во
InputFileMode равно False). Тип: string; Header
- строка, содержащая либо путь к файлу, в который будет
записан заголовок http-документа (если св-во
InputFileMode равно True), либо непосредственно
сам заголовок (если св-во InputFileMode равно
False). Тип: string; HeaderInfo
- структура, содержащая различную информацию о http-документе
(подробней см. в help-файле). Тип: THeaderInfo; InputFileMode
- тип записи результата. Значение True - запись в
файлы, указанные в свойствах Body и Header,
False - запись в сами эти свойства. Тип: Boolean; OutputFileMode
- тип отсылаемых данных (методами Put, Post и
Trace). Значение True - данные для отправки
содержатся в файлах, указанных при вызове этих методов, а
False - в самих аргументах этих методов. Тип: Boolean;
Далее некоторые свойства, унаследованные от
TPowerSock:
BytesRecvd, BytesSent, BytesTotal - количество отправленных,
принятых и общее количество байтов соотвественно. Тип: LongInt; Connected
- показывает, установленно ли в данный момент соединение.
Тип: Boolean; BeenCanceled
- показывает, было ли прервано соединение с сервером. Тип: Boolean; Host -
строка, содержащая хост-имя удаленного компьютера. Заполнять
не надо, так как это свойство устанавливается автоматически
при вызове методов Get, Put, Post и т.д.
Тип: string. Port - Integer, содержащий порт удаленного компьютера
(заполняется тоже
автоматически); TimeOut -
таймаут в миллисекундах. Тип: Integer;
Еще есть множество свойств, но я пока остановлюсь на уже
перечисленных. За дополнительной информацией обращайтесь к
help-у по Дельфи.
Методы
Get(URL:
string) - посылает запрос на указанный URL. Данные после
выполнения этого запроса записываются в файлы или в сами
свойства Body и Header (в зависимости от
значения свойства
InputFileMode); Head(URL:
string) - посылает запрос на указанный URL. Данные после
выполнения этого запроса записываются в файл или в само
свойство Header (в зависимости от значения свойства
InputFileMode). В отличие от метода Get, при
вызове Head запрос отсылается только на заголовок
http-документа; Post(URL,
PostData: string) - посылает запрос на изменение
http-документа (с адресом URL) на данные, содержащиеся в
параметре PostData. Если OutputFileMode равен
True, то в PostData должен содержаться путь к файлу,
содержащему нужные
данные. Put(URL, PutData:
string) - посылает запрос на создание http-документа (с
адресом URL), содержащего данные, переданные в параметре
PutData. Если OutputFileMode равен True, то в
PostData должен содержаться путь к файлу, содержащему нужные
данные. Trace(URL, TraceData:
string) - посылает запрос на получение отладочных данных
(для отладки соединения с HTTP-сервером). Данные для запроса
нужно указать в параметре TraceData. Если
OutputFileMode равен True, то в TraceData должен
содержаться путь к файлу, содержащему нужные
данные. Delete(URL:
string) - посылает запрос на удаление http-документа (с
адресом URL).
Далее некоторые методы, унаследованные от
TPowerSock:
Abort и Cancel - прерывают соединение и обмен
данными; Disconnect -
отсоединение от HTTP-сервера;
События
OnAuthenticationNeeded
- возникает, когда сервер требует указания имени пользователя
и пароля. В обработчике этого события (если оно возникнет) Вы
должны ответить серверу, запонив нужными значениями
соответствующие переменные. Примечание: Перед
установлением соединения можно сразу заполнить поля
UserID и Password в свойстве
HeaderInfo; OnAboutToSend
- возникает, когда компонент TNMHTTP собирается отправлять
данные (запрос). В обработчике этого события можно заполнить
дополнительной информацией свойство
SendHeader; OnFailure
- возникает, когда текущая операция завершилась неудачно, т.е.
произошла
ошибка; OnRedirect -
возникает, сервер переадресовал ссылку с указанной URL на
другую ссылку. Установив параметр handled в значение
True можно запретить переадресацию и остановиться на
запрошенной URL. Значение по умолчанию -
False; OnSuccess -
возникает, когда текущая операция завершилась успешно, т.е.
запрос был выполнен без ошибок;
Далее некоторые методы, унаследованные от
TPowerSock:
OnConnect
- возникает, когда соединение с сервером успешно
установлено; OnDisconnect
- возникает, когда соединение с сервером
завершено; OnConnectionFailed
- возникает, когда соединение с сервером установить не
удалось; OnError -
возникает, когда последняя операция была завершена с
ошибкой; OnHostResolved -
возникает, когда от DNS получен IP-адрес указанного
хоста; OnInvalidHost -
возникает, когда DNS вернул ошибку при попытке определить
IP-адрес указанного
хоста; OnPacketRecvd -
возникает, когда значения свойств BytesRecvd и
BytesTotal изменены, т.е. была принята новая порция
данных от
сервера; OnPacketSent -
возникает, когда значения свойств BytesSent и
BytesTotal изменены, т.е. была отправлена новая порция
данных на сервер; OnStatus
- возникает, когда статус компонента был изменен (для
обновления визуального оповещения пользователя);
Практика и примеры
Ну а теперь приступим к самому главному методу изучения - на
примерах.
И самый первый пример - программа, позволяющая определить,
существует ли заданный URL:
Пример 1. Проверка существования указанной URL
{... Здесь идет заголовок файла и определение формы TForm1 и ее экземпляра Form1}
{В форму нужно поместить кнопку TButton и одно поле TEdit. При нажатии на
кнопку вызывается обработчик события OnClick - Button1Click. Перед этим в
TEdit нужно ввести адрес URL. НЕ ЗАБУДЬТЕ ПОМЕСТИТЬ В ФОРМУ КОМПОНЕНТ TNMHTTP!}
procedure Button1Click(Sender: TObject);
begin
{Пытаемя получить заголовок}
NMHTTP1.Head(Edit1.Text);
{Если URL неверный, то здесь выскочит ошибка}
end;
Следующий
пример - скачивание сразу нескольких URL одновременно.
Надо заметить, что многие программисты пренебрегают многозадачностью
Windows (неважно, как она реализована, речь сейчас не об этом). В
Дельфи очень легко создавать отдельные, подчиненные Вашей программе
процессы (а точнее - потоки) с помощью базового класса
TThread. Но об этом мы поговорим в другой раз (в другой
статье).
Пример 3. Одновременное скачивание
указанных URL в заданный каталог
// Здесь идет заголовок файла и определение формы TForm1 и ее экземпляра Form1
// Описание класса отдельного процесса
type
THTTPThread = class(TThread)
private
{Для каждого процесса - создаем свой компонент TNMHTTP}
FHTTP: TNMHTTP;
protected
// Execute вызывается при запуске процесса; override - заменяем
// существующую процедуру базового класса TThread
procedure Execute; override;
// DoWork - созданная нами функция, выполнение которой синхронизируется в Execute
procedure DoWork;
public
// URL - созданная нами строка, указывающая процессу, какой URL ему нужно скачать
URL: string;
end;
// В форму нужно поместить три кнопки TButton, одно поле TEdit и один список
// TListBox. При нажатии на кнопку Button1 вызывается обработчик события
// OnClick - Button1Click. Перед этим в TEdit нужно ввести путь к каталогу, в
// котором будут храниться скачанные файлы, а ListBox1 нужно заполнить списком
// URL-ов для скачивания (с помощью кнопок Add (Button2) и Delete (Button3)).
procedure TForm1.Button3Click(Sender: TObject);
begin
{Удаление выделенного URL из списка}
if ListBox1.ItemIndex >= 0 then
ListBox1.Items.Delete(ListBox1.ItemIndex);
end;
procedure TForm1.Button2Click(Sender: TObject);
var s: string;
begin
{Добавление URL в список}
s := InputBox('Добавить','Введите URL:','');
if s <> '' then
ListBox1.Items.Add(s);
end;
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
{Проверка на существование каталога}
if Length(Edit1.Text) > 0 then
if not DirectoryExists(Edit1.Text) then
MkDir(Edit1.Text);
{Далее идет создание для каждого URL в списке своего процесса}
for i := 0 to ListBox1.Items.Count-1 do begin
with THTTPThread.Create(True) do begin
{Создаем приостановленную задачу, указываем ей ее URL и запускаем ее}
URL := ListBox1.Items[i];
Resume;
end;
end;
end;
// Операторы процесса THTTPThread
procedure THTTPThread.Execute;
begin
// Делаем так, чтобы каждый процесс выполнялся одновременно с другими (синхронизация)}
Synchronize(DoWork);
end;
procedure THTTPThread.DoWork;
var i: Integer;
begin
{Создаем компонент TNMHTTP}
FHTTP := TNMHTTP.Create(Form1);
{Результат надо записывать в файлы}
FHTTP.InputFileMode := True;
{Подбираем имена для файлов}
i := 1;
while FileExists(Form1.Edit1.Text+'\page'+IntToStr(i)+'.htm') do
Inc(i);
{Указываем, в какие именно файлы класть результат}
FHTTP.Body := Form1.Edit1.Text+'\body'+IntToStr(i)+'.htm';
FHTTP.Header := Form1.Edit1.Text+'\header'+IntToStr(i)+'.txt';
{Пытаемся послать запрос}
FHTTP.Get(URL);
{Перед завершением процесса не забываем освободить память из-под компонента}
FHTTP.Free;
end;
ПРИМЕЧАНИЕ: Чтобы завершить некоторый процесс
(Thread), нужно вызвать метод Terminate класса этого
процесса. Приостановить процесс можно оператором Suspend, а
продолжить выполнение - Resume. Также можно настроить
приоритет каждого отдельного процесса через свойство
Priority.
Неплохой пример работы с процессами можно найти в подпапке
Demos\Threads папки, куда Вы установили Delphi.
Замечания по алгоритмам типовых задач
Если Вы собираетесь создать скачивалку сайтов, то Вам необходимо
учитывать следующее (решить следующие проблемы):
- Нужно скачивать не только саму страничку в формате HTML, но и
все входящие в нее рисунки (gif, jpg, и т.д.);
- в некоторых случаях удобно скачивать не одну страничку, а
несколько страниц, ссылки на которые находятся на первой из
скачиваемых страничек. При этом нужно учитывать, что на страничке
могут находиться и ссылки на другие сайты, поэтому необходимо
анализировать скачиваемые ссылки (чтобы случайно не скачать весь
Интернет). Для решения задачи со скачиванием нескольких страничек
нужно использовать рекурсию;
- необходимо качественно информировать пользователя о ходе
закачки. Т.е. показывать общее и скачанное количество информации;
- после скачивания нужно заменить Интернетовские ссылки на
локальные, чтобы можно было просматривать странички в режиме
offline.
|