Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Delphi - проблемы и решения" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Программирование на DELPHI v3-7 Сетевое программирование(Часть 2)
Информационный Канал Subscribe.Ru |
Программирование на 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 от Антон Доброе время суток!! |
Отвечает OLEG666 А HELP'а с этой библиотекой не шло? Если хелп на инглише, то я могу перевести.... |
Вопрос #2 от _yurok_@tut.by У меня вопрос. Мне необходимо программно записать на CD определенный
|
Отвечает Angel Ну зачем тебе чужая библиотека? А вместе с ней и глюки и недоработки.... Пиши свою(альтернативную) процедуру записи!!! |
Отвечает OLEG666 Попробуй декомпилировать эту библиотеку, т.к я очень удивлюсь, если ты хоть где-то найдешь подобную инфу:((( |
Вопрос #3 от Igor Ivanov Хотел бы узнать как извлеч региональные настройки а именно разделитель дробной части. |
Отвечает dig-vam unit SysUtils; |
Отвечает KSTU Webmaster Попробуй сконветрировать любое дробное число |
Отвечает GLUK : DecimalSeparator - для дробной части; |
Вопрос #4 от jurik200@rol.ru А скажите мне |
Отвечает Angel DELPHI-это среда разработки программ, а насчёт того ставить-ли вам
её |
Отвечает GLUK : Значит так, такого языка ваще нету, кто те такое сказал ваще :) |
С уважением, Angel(http://www.fordelphi.narod.ru)
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||