Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на Delphi

  Все выпуски  

Программирование на DELPHI v3-7 Сетевое программирование(Часть 2)


Информационный Канал Subscribe.Ru

Программирование на DELPHI

Программирование на DELPHI


Привет ВСЕМ.Сетевое програмирование(Часть 2).
Если у вас есть предложения или замечания, прошу писать мне ForDelphi@Narod.ru

В этом выпуске

1)Получение файла из сети -->
2)Как проверить существование URL? -->
3)Как скачать любой URL используя стандартные настройки сети?-->
4)Проверка правильности E-mail адреса -->
5)Вопросы -->
6)Ответы -->


Получение файла из сети

Обычно при разработке приложений, которые планируется в дальнейшем обновлять и усовершенствовать, основные модули хранятся в виде пакетов (Package) или библиотек DLL. В настоящее время Internet предоставляет возможность без особых усилий осуществлять обновление этих модулей. Поэтому добавление к Вашему приложению функции авто-обновления, является наилучшим способом для обновления приложения.

Давайте посмотрим, как реализовывается данный механизм в любом FTP приложении.

Delphi предоставляет нам полный доступ к WinInet API (wininet.pas), который можно использовать для соединения и получения файлов с веб-сайта, который использует либо Hypertext Transfer Protocol (HTTP) либо File Transfer Protocol (FTP). Например, мы можем использовать функции из WinInet API для: добавления FTP браузера в любое приложение, создания приложения, которое автоматически скачивает файлы с общедоступных FTP серверов или поиска Internet сайтов, ссылающихся на графику и скачивать только графику.

Функция GetInetFile

uses Wininet;

function GetInetFile
(const fileURL, FileName: String): boolean;
const BufferSize = 1024;
var
hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
f: File;
sAppName: string;
begin
Result:=False;
sAppName := ExtractFileName(Application.ExeName);
hSession := InternetOpen(PChar(sAppName),
INTERNET_OPEN_TYPE_PRECONFIG,
nil, nil, 0);
try
hURL := InternetOpenURL(hSession,
PChar(fileURL),
nil,0,0,0);
try
AssignFile(f, FileName);
Rewrite(f,1);
repeat
InternetReadFile(hURL, @Buffer,
SizeOf(Buffer), BufferLen);
BlockWrite(f, Buffer, BufferLen)
until BufferLen = 0;
CloseFile(f);
Result:=True;
finally
InternetCloseHandle(hURL)
end
finally
InternetCloseHandle(hSession)
end
end;

Обратите внимание: Чтобы обеспечить некоторую визуальную обратную связь для пользователя, Вы можете добавить строчку наподобие FlashWindow(Application.Handle,True) в тело блока "повторить/до тех пор" (repeat/until). Вызов FlashWindow API высвечивает заголовок Вашего имени приложений в панели задач.

Использование
Для вызова функции GetInetFile можно использовать следующий код:

var FileOnNet, LocalFileName: string
begin
FileOnNet:=
'http://delphi.about.com/library/forminbpl.zip';
LocalFileName:='File Downloaded From the Net.zip'

if GetInetFile(FileOnNet,LocalFileName)=True then
ShowMessage('Download successful')
else
ShowMessage('Error in file download')
end;

Данный код запрашивает файл 'forminbpl.zip' с сайта, скачивает его, и сохраняет его как 'File Downloaded From the Net.zip'..


Как проверить существование URL?

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

URL может быть как с префиксом http:/ так и без него - эта функция добавляет префикс http:// если он отсутствует (необходимо для функции internetOpenUrl которая так же поддерживает FTP:// и gopher://

Эта функция проверяет только два возвращаемых кода '200'(ОК) или '302' (Редирект), но Вы можете заставить проверять функцию и другие коды. Для этого достаточно модифицировать строчку "result := ".

Платформа: Delphi 3.x (или выше)

uses wininet;

Function CheckUrl(url:string):boolean;
var
hSession, hfile, hRequest: hInternet;
dwindex,dwcodelen :dword;
dwcode:array[1..20] of char;
res : pchar;
begin
if pos('http://',lowercase(url))=0 then
url := 'http://'+url;
Result := false;
hSession := InternetOpen('InetURL:/1.0',
INTERNET_OPEN_TYPE_PRECONFIG,nil, nil, 0);
if assigned(hsession) then
begin
hfile := InternetOpenUrl(
hsession,
pchar(url),
nil,
0,
INTERNET_FLAG_RELOAD,
0);
dwIndex := 0;
dwCodeLen := 10;
HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE,
@dwcode, dwcodeLen, dwIndex);
res := pchar(@dwcode);
result:= (res ='200') or (res ='302');
if assigned(hfile) then
InternetCloseHandle(hfile);
InternetCloseHandle(hsession);
end;
end;


Как скачать любой URL используя стандартные настройки сети?

Начиная с Internet Explorer 3, Microsoft поддерживает очень полезные API, Wininet. Эти функции позволяют использовать все возможности IE, такие как настройки прокси, кэширование файлов и т.д.

Ниже приведён пример использования этих функций для скачивания файла с нужного URL. Это может быть любой доступный URL, ftp://, http://, gopher://, и т.д.

function DownloadFile(const Url: string): string;
var
NetHandle: HINTERNET;
UrlHandle: HINTERNET;
Buffer: array[0..1024] of char;
BytesRead: cardinal;
begin
Result := '';
NetHandle := InternetOpen('Delphi 5.x', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

if Assigned(NetHandle) then
begin

UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);

if Assigned(UrlHandle) then
{ UrlHandle правильный? Начинаем загрузку }
begin
FillChar(Buffer, SizeOf(Buffer), 0);
repeat
Result := Result + Buffer;
FillChar(Buffer, SizeOf(Buffer), 0);
InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
until BytesRead = 0;
InternetCloseHandle(UrlHandle);
end
else
begin
{ UrlHandle неправильный. Генерируем исключительную ситуацию. }
raise Exception.CreateFmt('Cannot open URL %s', [Url]);
end;

InternetCloseHandle(NetHandle);
end
else
{ NetHandle недопустимый. Генерируем исключительную ситуацию }
raise Exception.Create('Unable to initialize Wininet');
end;


Проверка правильности E-mail адреса

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

Совместимость: Delphi 3.x (или выше)

function IsValidEmail(const Value: string): boolean;
function CheckAllowed(const s: string): boolean;
var
i: integer;
begin
Result:= false;
for i:= 1 to Length(s) do
begin
{ недопустимый символ в s - значит недопустимый адрес }
if not (s[i] in ['a'..'z', 'A'..'Z', '0'..'9', '_', '-', '.']) then
Exit;
end;
Result:= true;
end;
var
i: integer;
namePart, serverPart: string;
begin // начало выполнения IsValidEmail
Result:= false;
i:= Pos('@', Value);
if i = 0 then
Exit;
namePart:= Copy(Value, 1, i - 1);
serverPart:= Copy(Value, i + 1, Length(Value));
// @ не указано имя имя или сервер не указаны; минимально для сервера. "a.com"
if (Length(namePart) = 0) or ((Length(serverPart) < 5)) then
Exit;
i:= Pos('.', serverPart);
// должно иметь точку и как минимум три знака от конца
if (i = 0) or (i > (Length(serverPart) - 2)) then
Exit;
Result:= CheckAllowed(namePart) and CheckAllowed(serverPart);
end;


Вопросы

Напоминаю всем, что свой вопрос вы можите задать по адресу fordelphi@narod.ru с темой VOPROS

Вопрос #5 от GLUK

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

ОТВЕТИТЬ


Вопрос #6 от LEONID

Доброго дня и ночи!

Может быть я чего-то не понимаю, но у меня в стандартно
установленном Delphi7 нет вкладки FASTNet ?!
Помогите, пожалуйста, разобраться.
--
Успехов во всем! icq:99728344
Тутов Леонид Васильевич mailto:leon@plotinka.ru

ОТВЕТИТЬ


Вопрос #7 от CALEAN

Доброго Вам времени суток! Пишет вам Николай! В начале
хотелось бы поздравить вас с наступающим Новым Годом,
пожелать всего наилучшего и больших успехов в Ваших делах!
Мне очень понравилась ваша рассылка, я узнаю много новых и
познавательных вещей в Делфи, но на данный момент мой папа
задал мне задачу, где мне нужно рисовать графики используя
определённые данные. Я решил использовать один из
компонентов TChart, TDBChart и TQRChart. Но так как я не
имею никакой информации об этих компонентах я почти ничего
не понял о том как с ними работать. Методом ?тыканья?
ничего не получается, в internet-е ничего конкретного не
могу найти, не могли бы Вы мне прислать информацию об этих
компонентах или хотя бы конкретные ссылки в internet-е.
Заранее благодарю, с уважением Николай! Еще раз с
наступающим Новым Годом!

ОТВЕТИТЬ


Вопрос #8 от FAz

Hello :)
что делает windiws когда идет подключение к интернету
и когда отключается ??
--
..... )

ОТВЕТИТЬ


Вопрос #9от oleg666

Приветик, подскажите пожалуйста, как integer отобразить в string

ОТВЕТИТЬ


Ответы

Вопрос #1 от Антон

Доброе время суток!!
Есть библиотека Async Professional v.4.06.
Подскажите как установить и как пользоваться.
С уважением Антон

Отвечает OLEG666

А HELP'а с этой библиотекой не шло? Если хелп на инглише, то я могу перевести....

Вопрос #2 от _yurok_@tut.by

У меня вопрос. Мне необходимо программно записать на CD определенный
каталог с винчестера. Желательно использовать библиотеку NeroAPI.dll.
Может быть у Вас есть исходники для такого задания или ссылки, где
можно узнать это. Очень нужно!
Заранее благодарен.

Отвечает Angel

Ну зачем тебе чужая библиотека? А вместе с ней и глюки и недоработки.... Пиши свою(альтернативную) процедуру записи!!!

Отвечает OLEG666

Попробуй декомпилировать эту библиотеку, т.к я очень удивлюсь, если ты хоть где-то найдешь подобную инфу:(((

Вопрос #3 от Igor Ivanov

Хотел бы узнать как извлеч региональные настройки а именно разделитель дробной части.

Отвечает dig-vam

unit SysUtils;
var
CurrencyString: string;
CurrencyFormat: Byte;
NegCurrFormat: Byte;
ThousandSeparator: Char;
DecimalSeparator: Char; // <--------------------------------------------
CurrencyDecimals: Byte;
DateSeparator: Char;
ShortDateFormat: string;
LongDateFormat: string;
TimeSeparator: Char;
TimeAMString: string;
TimePMString: string;
ShortTimeFormat: string;
LongTimeFormat: string;
ShortMonthNames: array[1..12] of string;
LongMonthNames: array[1..12] of string;
ShortDayNames: array[1..7] of string;
LongDayNames: array[1..7] of string;
SysLocale: TSysLocale;
TwoDigitYearCenturyWindow: Word = 50;
ListSeparator: Char;

Отвечает KSTU Webmaster

Попробуй сконветрировать любое дробное число
в текст и взять из получившейся строки то,
что не я вляется цифрой

Отвечает GLUK :

DecimalSeparator - для дробной части;
DateSeparator - для даты;
TimeSeparator - для времени...

Вопрос #4 от jurik200@rol.ru

А скажите мне
пожалуйста,несведующему человеку, а что такое DELCHI?А то что-то я ни разу о нем не слыхал. для чего
он нужен и чем он отличается от других,подобных ему программ или языков(смотря конечно,что это такое,а я не
знаю).МОЖЕТ МНЕ ЕГО СЕБЕ ПОСТАВИТЬ НА КОМП. Что вы мне посоветуете по этому поводу!

Отвечает Angel

DELPHI-это среда разработки программ, а насчёт того ставить-ли вам её
к сибе на комп- я не знаю, но если вы собираетесь учить язык PASKAL(на нём
собственно и пишуться программы), то я думаю-ЛУЧЬШЕ СРЕДЫ РАЗРАБОТКИ
НЕ НАЙТИ!

Отвечает GLUK :

Значит так, такого языка ваще нету, кто те такое сказал ваще :)


С уважением, Angel(http://www.fordelphi.narod.ru)



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное