Механизм обработки сообщений в Delphi

В число базовых в иерархии классов Delphi входят класс TComponent и построенный на его базе класс TControl, который содержит обработ­чики многих событий, а также методы для преобразования стандарт­ных Windows-сообщений в собьггия в контексте Delphi. Отметим, что эта преобразования во многом напоминают преобразования (message crackers), выполняемые в файле WINDOWSX.H, входящем в состав SDK Windows 3.1. Класс TControl выступает предком для многих визу­альных компонентов, входящих в состав Delphi. В частности, класс TControl содержит обработчики сообщений, относящихся к манипу­лятору «мышь»: WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN, WM_LBUTTONDBLCLK, WM_RBUT-TONDBLCLK, WM_MBUTTONDBLCLK, WM_MOUSEMOVE, WMJLBUTTONUP, WM_RBUTTONUP и WM_MBUTTONUP.

Чтобы представить себе механизм обработки сообщений в Delphi, давайте, например, посмотрим на обработчик сообщения WMMOUSEMOVE. Обработчик этого сообщения вызывает метод MouseMove и передает ему три параметра — координаты курсора мыши при юзникновении данного события и информацию о состоянии клавиш Shift, Alt и Ctrl, преобразованную с помощью функции KeysToShiftState. Эта функция заполняет тип TShiftState информаци­ей, взятой из параметра wParam оригинального сообщения Windows:

Значение Описание Параметр Shift
MK_SHIFT Нажата клавиша Shift ssShift
MK_CONTROL Нажата клавиша Ctrl ssCtr!
MK_LBUTTON Нажата левая кнопка мыши ssLeft
MK_RBUTTON Нажата правая кнопка мыш ssRight
MK_MBUTTON Нажата средняя кнопка мьи ssMiddle

Получив преобразованное сообщение, метод MouseMove пре­образует его в событие OnMouseMove и передает его обработчику этого события:

if Assigned(FOnMouseMove) {Обработчик существует?}

then FOnMouseMove(Self, Shift, X, Y);

Обработка сообщения WMLBUTTONDOWN выглядит чуть сложнее. Обработчик этого сообщения проверяет, может ли ком­понент обрабатывать сообщения от мыши, а затем вызывает ме­тод DoMouseDown, передавая ему неизмененное сообщение и параметр, указывающий на то, что нажата левая кнопка мыши. Метод DoMouseDown «распаковывает» оригинальное сообщение Message и передает параметры методу MouseDown:

MouseDown(Button, KeysToShiftState(Keys) + Shift, XPos, YPos);

Получив преобразованное таким образом сообщение, метод MouseDown преобразует его в событие OnMouseDown и передает его обработчику этого события:

if Assigned(FOnMouseDown)

{Обработчик существует?}

then FOnMouseDown(Self, Button, Shift, X, Y);

Точно так же сообщения о нажатии правой и средней кнопок мыши (WM_RBUTTONDOWN и WM MBUTTONDOWN) пре­образуются в событие OnMouseDown. Единственным исключе­нием является то, что в случае нажатия правой кнопки мыши дополнительно проверяется наличие у интерфейсного элемента локального (popup) меню:

Control := Self;

while Control <> nil do

begin

if (Control.PopupMenu <> nil)

and Control.PopupMenu.AutoPopup then

begin

Control.Perform(CM_CANCELMODE, 0, 0);

with ClientToScreen(Pos) do

Control.PopupMenu.Popup(X, Y);

Exit;

end;

Control := Control.Parent;

end;

С обработчиками событий от клавиатуры дело обстоит иначе. Во-первых, они рассматриваются как нотификационные сооб­щения и имеют отличные от стандартных названия:

Нотификационное сообщение Сообщение ядра Windows
CN_KEYDOWN WM_KEYDOWN
CNKEYUP WM_KEYUP;
CN_CHAR WM_CHAR
CN_SYSKEYDOWN WM_SYSKEYDOWN
CN_SYSCHAR WM_SYSCHAR

и включают специальные обработчики, которые умеют распозна­вать многие клавиши, обладающие функциональностью в среде Delphi, обработкой же других клавиш занимается процедура WndProc (вызываемая методом Perform). Отмечу, что создание специальных обработчиков вызвано скорее всего тем, что разра­ботчик может создать объект — наследник любого компонента и в нем переопределить метод — обработчик того или иного сообще­ния Windows, тем самым нарушив функциональность ядра Delphi (если не вызван унаследованный обработчик через ключевое сло­во inherited). Чтобы избежать этого, все ключевые (для функцио­нальности Delphi-приложения) сообщения Windows имеют спе­циальные индексы. Несмотря на то что эта процедура имеет на­звание WndProc(то есть «оконная процедура»), все, чем она зани­мается, — это обработка сообщений, связанных с перемещением элементов. Далее в игру вступает еще одна процедура — Dispatch.Именно эта процедура (а точнее, метод объекта TObject) является «сердцем» механизма обработки сообщений. Она и вызывает кон­кретные обработчики Windows-сообщений, указанные как индекс (соответствующий номеру сообщения и задаваемый при описании метода-обработчика) в таблице виртуальных методов объекта.

Что вы узнали в этой главе

· О всех событиях, происходящих в системе, ядро Windows ин­формирует окна путем посылки сообщений их оконным функ­циям.

· Delphi дает разработчику полный доступ к событийной модели работы Windows, при этом максимально упрощая процесс об­работки того или иного события.

· Изначально источником событий от клавиатуры или мыши яв­ляется драйвер клавиатуры или мыши, затем ядро Windows пре­образует их в стандартный вид и пересылает окну программы.

· Протокол Drag and Drop позволяет пользователям легко мани­пулировать компонентами внутри формы.

· Событие OnChange,рассматриваемое в этом разделе, имеет чрез­вычайно важное значение в цикле работы приложения. Оно возникает в том случае, когда содержимое компонента измене­но.

· Создавая собственные обработчики событий, необходимо пом­нить следующее:

- обработчики всегда являются процедурами;

- обработчики объявляются с помощью директивы message;

- после директивы message всегда следует константа, указываю­щая номер обрабатываемого сообщения;

- обработчики имеют всего один параметр типа TMessage.

Страница Additional

На странице Additional размещены объекты, позволяющие создать более красивый пользовательский интерфейс программы.

Механизм обработки сообщений в Delphi - student2.ru

Список компонент:

Механизм обработки сообщений в Delphi - student2.ru

TBitBtn -кнопка вроде TButton, однако на ней можно разместить картинку (glyph). TBitBtn имеет несколько предопределенных типов (bkClose, bkOK и др), при выборе которых кнопка принимает соответствующий вид. Кроме того, нажатие кнопки на модальном окне (Form2.ShowModal) приводит к закрытию окна с соответствующим модальным результатом (Form2.ModalResult).

Механизм обработки сообщений в Delphi - student2.ru

TSpeedButton -кнопка для создания панели быстрого доступа к командам (SpeedBar). Пример - SpeedBar слева от Палитры Компонент в среде Delphi. Обычно на данную кнопку помещается только картинка (glyph).

Механизм обработки сообщений в Delphi - student2.ru

TTabSet - горизонтальные закладки. Обычно используется вместе с TNoteBook для создания многостраничных окон. Название страниц можно задать в свойстве Tabs. Но проще это сделать в программе при создании формы (OnCreate) :

TabSet1.Tabs := Notebook1.Pages;

А для того, чтобы при выборе закладки страницы перелистывались нужно в обработчике события OnClick для TTabSet написать:

Notebook1.PageIndex := TabSet1.TabIndex;

Механизм обработки сообщений в Delphi - student2.ru

TNoteBook - используется для создания многостраничного диалога, на каждой странице располагается свой набор объектов. Используется совместно с TTabSet.

Механизм обработки сообщений в Delphi - student2.ru

TTabbedNotebook - многостраничный диалог со встроенными закладками, в данном случае - закладки сверху.

Механизм обработки сообщений в Delphi - student2.ru

TMaskEdit -аналог TEdit, но с возможностью форматированного ввода. Формат определяется в свойстве EditMask. В редакторе свойств для EditMask есть заготовки некоторых форматов: даты, валюты и т.п. Спец. символы для маски можно посмотреть в Справочнике.

Механизм обработки сообщений в Delphi - student2.ru

TOutline - используется для представления иерархических отношений связанных данных. Например - дерево директорий.

Механизм обработки сообщений в Delphi - student2.ru

TStringGrid -служит для представления текстовых данных в виде таблицы. Доступ к каждому элементу таблицы происходит через свойство Cell.

Механизм обработки сообщений в Delphi - student2.ru

TDrawGrid - служит для представления данных любого типа в виде таблицы. Доступ к каждому элементу таблицы происходит через свойство CellRect.

Механизм обработки сообщений в Delphi - student2.ru

TImage -отображает графическое изображение на форме. Воспринимает форматы BMP, ICO, WMF. Если картинку подключить во время дизайна программы, то она прикомпилируется к EXE файлу.

Механизм обработки сообщений в Delphi - student2.ru

TShape -служит для отображения простейших графических объектов на форме: окружность, квадрат и т.п.

Механизм обработки сообщений в Delphi - student2.ru

TBevel - элемент для рельефного оформления интерфейса.

Механизм обработки сообщений в Delphi - student2.ru

THeader- элемент оформления для создания заголовков с изменяемыми размерами для таблиц.

Механизм обработки сообщений в Delphi - student2.ru

TScrollBox - позволяет создать на форме прокручиваемую область с размерами большими, нежели экран. На этой области можно разместить свои объекты.

Страница Dialogs

Механизм обработки сообщений в Delphi - student2.ru

На странице Dialogs представлены компоненты для вызова стандартных диалогов Windows. Внешний вид диалогов зависит от используемой версии Windows. Объекты, представленные на данной странице невидимы во время выполнения и вызов диалогов происходит программно, например:

if OpenDialog1.Execute then Image1.Picture.LoadFromFile(OpenDialog1.FileName);

Диалоги Windows в порядке появления на странице Dialogs:

· OpenDialog; выбрать файл

· SaveDialog; сохранить файл

· FontDialog; настроить шрифт

· ColorDialog; выбор цвета

·

· PrintDialog; печать

· PrinterSetupDialog; настройка принтера

· FindDialog; поиск строки

· ReplaceDialog; поиск с заменой

Страница System

Механизм обработки сообщений в Delphi - student2.ru

Страница представляет набор компонент для доступа к некоторым системным сервисам типа таймер, DDE, OLE и т.п.

Механизм обработки сообщений в Delphi - student2.ru

TTimer -таймер, событие OnTimer периодически вызывается через промежуток времени, указанный в свойстве Interval. Период времени может составлять от 1 до 65535 мс.

Механизм обработки сообщений в Delphi - student2.ru

TPaintBox -место для рисования. В обработчики событий, связанных с мышкой передаются относительные координаты мышки в TPaintBox, а не абсолютные в форме.

Механизм обработки сообщений в Delphi - student2.ru

TFileListBox -специализированный ListBox, в котором отображаются файлы из указанной директории (св-во Directory). На названия файлов можно наложить маску, для этого служит св-во Mask. Кроме того, в св-ве FileEdit можно указать объект TEdit для редактирования маски.

Механизм обработки сообщений в Delphi - student2.ru

TDirectoryListBox -специализированный ListBox, в котором отображается структура директорий текущего диска. В св-ве FileList можно указать TFileListBox, который будет автоматически отслеживать переход в другую директорию.

Механизм обработки сообщений в Delphi - student2.ru

TDriveComboBox -специализированный ComboBox для выбора текущего диска. Имеет свойство DirList, в котором можно указатьTDirectoryListBox, который будет отслеживать переход на другой диск.

Механизм обработки сообщений в Delphi - student2.ru

TFilterComboBox - специализированный ComboBox для выбора маски имени файлов. Список масок определяется в свойстве Filter. В свойстве FileList указывается TFileListBox, на который устанавливается маска.

!!!!С помощью последних четырех компонент (TFileListBox, TDirectoryListBox, TDriveComboBox, TFilterComboBox) можно построить свой собственный диалог выбора файла, причем для этого не потребуется написать ни одной строчки кода.

Механизм обработки сообщений в Delphi - student2.ru

TMediaPlayer -служит для управления мултимедйными устройствами (типа CD-ROM, MIDI и т.п.). Выполнен в виде панели управления с кнопками Play, Stop, Record и др. Для воспроизведения может понадобиться как соответствующее оборудование, так и программное обеспечение. Подключение устройств и установка ПО производится в среде Windows. Например, для воспроизведения видео, записанного в формате AVI, в потребуется установить ПО MicroSoft Video (в Windows 3.0, 3.1, WFW 3.11).

Механизм обработки сообщений в Delphi - student2.ru
Механизм обработки сообщений в Delphi - student2.ru

TOLEContainer - контейнер, содержащий OLE объекты. Поддерживается OLE 2.02.

TDDEClientConv,TDDEClientItem, TDDEServerConv, TDDEServerItem -4 объекта для организации DDE. С помощью этих объектов можно построить приложение как DDE-сервер, так и DDE-клиент.

Страница VBX

Механизм обработки сообщений в Delphi - student2.ru
Механизм обработки сообщений в Delphi - student2.ru

Поскольку формат объектов из MicroSoft Visual Basic (VBX) является своего рода стандартом и существует большое количество библиотек таких объектов, то в Delphi была предусмотрена совместимость с этим форматом. VBX версии 1.0 можно включить в Палитру Компонент Delphi и использовать их как “родные” компоненты (в том числе, выбирать их в качестве предков и наследовать свойства и методы).

TBiSwitch -двухпозиционный переключатель.

Механизм обработки сообщений в Delphi - student2.ru

TBiGauge - прогресс-индикатор.

Механизм обработки сообщений в Delphi - student2.ru

TBiPict -аналог TImage.

Механизм обработки сообщений в Delphi - student2.ru

TChartFX -деловая графика.

Наши рекомендации