Рефераты. Программирование на Delphi

Обмен сообщениями

Как уже упоминалось ранее, операционная система Windows® основана на сообщениях, возникающих в результате действий пользователя, аппаратуры компьютера или других программ. Поведение каждого окна полностью определяется тем, какие оно принимает сообщения и как их обрабатывает. В большинстве случаев, обработка сообщений в Delphi выполняется через события. Однако, бывают ситуации, когда может потребоваться послать и/или обработать сообщение самостоятельно. Существуют два типа сообщений, которые могут потребовать обработки в обход обычной системы сообщений Delphi:

Сообщения Windows®, не обрабатываемые VCL
Сообщения, определяемые пользователем

В принципе, сообщения делятся на две категории:

Командные сообщения
Уведомляющие сообщения

Командные сообщения используются как программистами, тек и Windows®. Они управляют элементам операционной системы и прикладным программам. Уведомляющие сообщения содержат информацию об изменении состояния окон Windows®, их отдельных элементов и устройств системы. Они посылаются только самой средой окон Windows®.

Каждое сообщение имеет два параметра: WPARAM и LPARAM. В 32-х битной среде оба эти параметра имеют размер 32 бита (longword). В 16-битной Windows WPARAM - это 16 битное число (word), а LPARAM - 32-битное (longint).

Для отправки сообщений API Windows® содержит две функции:

function PostMessage( HWND hWnd, // handle of destination window
UINT Msg, // message to post
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
):BOOLEAN;

function SendMessage( HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
): LRESULT;

Первая из них отправляет сообщение в очередь сообщений Windows® и немедленно возвращает управление. PostMessage возвращает TRUE, если вызов функции прошел успешно и FALSE в противном случае.

Функция SendMessage отличается от PostMessage тем, что, послав сообщение, она не возвратит управление до тех пор, пока сообщение не будет доведено до получателя.

Обе функции имеют одинаковые параметры: HWND - дескриптор окна, которому предназначается сообщение, UINT - сообщение, которое должно быть послано, WPARAM и LPARAM - параметры сообщения.

В следующем примере главной форме проекта посылается сообщение о закрытии приложения:

PostMessage(Handle,WM_QUIT,0,0);

В дополнение к функциям API Windows® VCL содержит метод Perform, который можно использовать для посылки сообщений любому окну VCL.

function Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;

Perform обходит систему передачи сообщений Windows® и направляет сообщение непосредственно механизму обработки данного окна. С использованием предыдущий пример будет выглядеть следующим образом:

Perform(WM_QUIT,0,0);

VCL имеет события примерно лишь для 20% наиболее часто используемых сообщений Windows®. У программиста может возникнуть необходимость обработать сообщения, для которых в VCL события не предусмотрены. Для обработки сообщений ОС, не имеющих соответствующих событий в Delphi есть ключевое слово message. С его помощью конкретный метод в коде программы может быть связан с любым сообщением Windows®. Когда окно приложения получает это сообщение вызывается соответствующий метод. Для реализации обработки сообщения на этом уровне необходимо:

1. Включить объявление метода для обработки сообщения в объявление класса, указав ключевое слово message и название сообщения, для обработки которого данный метод редназначен.

2. Включить определение метода в раздел implementation.

Приведем пример определения метода, обрабатывающего сообщение WM_ERASEBKGND:

Procedure WmEraseBkgnd(var Msg:tWMEraseBkgnd); message WM_ERASEBKGND;

Ключевое слово message указывает на то, что данный метод используется для обработки сообщения ОС, имя которого указано после этого ключевого слова: WM_ERASEBKGND. Следует также отметить, что параметр метода является записью типа tWMEraseBkgnd.

type TWMEraseBkgnd=record
Msg:Cardinal;
DC:HDC;
Unused:Longint;
Result:Longint;
end;

В VCL имеются записи для большинства сообщений Windows® (они определены в модуле Messages.pas). Именем записи является имя сообщения с префиксом t и без подчеркивания. Сам метод можно назвать как угодно, но приведенная выше форма является общепринятой. В этом методе может возникнуть необходимость вызвать обработчик сообщения, установленный по умолчанию. Для этого необходимо вызвать виртуальный метод класса tObject DefaultHandler:

procedure tObject.DefaultHandler(var Message); virtual;

Помимо нормальных сообщений Windows®, можно создать свое собственное сообщение. еализация и перехват определяемого пользователем сообщения идентичны обработке сообщений Windows®. Единственное отличие состоит в том, что это сообщение необходимо сначала определить:

Const My_Message = WM_USER + 1;

Эта строка объявляет пользовательское сообщение с именем My_Message.

Для обработки сообщений, определенных пользователем в качестве типа параметра обработчика сообщения следует использовать запись общего вида tMessage:

type tMessage = record
Msg:Cardinal;
WParam:Longint;
LParam:Longint;
Result:Longint;
end;

Здесь, как и во всех других определенных в VCL для сообщений записях, поле Msg определяет передаваемое сообщение, поле Result - результат действия обработчика. Уникальные для данной записи поля WParam и LParam содержат соответствующие параметры сообщения.

Для посылки определяемых пользователем сообщений можно использовать функции SendMessage, PostMessage, однако, предпочтительнее в данном случае использовать Perform.

Сокеты

Наиболее современным и даже "модным" является общение процессов на уровне сокетов. Популярность их обусловлена взрывным ростом интереса как пользователей, так и специалистов к Internet и всему, что связано с этой сетью.

Общепринятой и стандартизованной на международном уровне является семиуровневая модель структуры протоколов связи под названием интерфейс открытых систем (Open Systems Interface, OSI). На каждом из уровней — от первого, физического, до высших уровней представления и приложений — решается свой объем задач и используется свой инструментарий.

Сокеты находятся как раз на промежуточном, так называемом транспортном уровне семиуровневой структуры. "Под ним", на сетевом уровне, находится протокол IP (основа TCP/IP — Transmission Control Protocol/Internet Protocol). Над ним находятся протоколы сеансового уровня (сервисы), ориентированные на конкретные задачи — например, FTP (для передачи файлов), SMTP (почтовый), всем известный гипертекстовый протокол HTTP и другие. Использование сокетов, с одной стороны, позволяет абстрагироваться от частностей работы на нижних уровнях, с другой — решать широкий круг задач, недоступный специализированным протоколам.

С точки зрения своей сущности сокет — это модель одного конца сетевого соединения, со своими свойствами и возможностью читать и записывать данные. С точки зрения содержания — это прикладной программный интерфейс, входящий в состав разных операционных систем, в том числе Windows — начиная с версии 3.11. Последняя его реализация носит название WinSock 2.0. Прототипы функций содержатся в файле WINSOCK.PAS, поставляемом с Delphi.

API сокетов впервые появился в среде Unix и стал популярен вместе с (и благодаря) протоколом TCP/IP. Именно они являются строительным материалом, из которого построена сеть Internet. Но сокеты не обязательно базируются на TCP/IP, они могут базироваться на IPX/SPX и других протоколах.

Механизм соединения при помощи сокетов таков. На одной стороне создается клиентский сокет. Для инициализации связи ему нужно задать путь к серверному сокету, с которым предстоит установить соединение.

Путь в сети задается двумя параметрами: адресом или равноценным ему именем хоста, или просто хостом и номером порта. Хост — это система, в которой запущено приложение, содержащее сокет. Неверно приравнивать понятие "хост" или "адрес" к понятию "компьютер" — у компьютера может быть несколько сетевых устройств и несколько адресов. Адрес в сетях TCP/IP задается четверкой чисел в диапазоне 0..255, например, так: 192.168.99.1. Естественно, каждый адрес даже в рамках Internet уникален — за этим следит специальная организация. Имя хоста, как правило, — символьная строка, поставленная в соответствие адресу и записанная по правилам UNC, например #"#">> раздел hardware


Обзоры программ:
> раздел software


Программирование:
> раздел programming


Операционные системы:
> раздел ОС


Графика и дизайн:
> раздел graphics


Сетевые технологии:
> раздел network



Страницы: 1, 2, 3, 4, 5, 6, 7, 8



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.