Чтение онлайн

на главную - закладки

Жанры

О чём не пишут в книгах по Delphi

Григорьев Антон Борисович

Шрифт:

Для завершения обработки сообщения

WM_PAINT
осталось только вызвать
EndPaint
, разумеется, только в том случае, если
BeginPaint
вызывали мы сами.

И последнее, что мы должны сделать, — это передать все остальные сообщения стандартному обработчику. После этого программа PanelMsg готова.

1.2.5. Пример NumBroadcast

Программа NumBroadcast демонстрирует широковещательную рассылку глобальных сообщений. Окно программы показано на рис. 1.10.

Рис 1.10.

Окно программы NumBroadcast

Для того чтобы увидеть, как работает программа, нужно запустить несколько ее экземпляров. После ввода числа и нажатия кнопки Разослать любому из экземпляров программы число под кнопкой меняется во всех экземплярах. Чтобы добиться такого эффекта, программа NumBroadcast регистрирует глобальное сообщение с помощью функции

RegisterWindowMessage
, а в оконной процедуре предусмотрена реакция на это сообщение (число передастся через параметр
WParam
). Код программы приведен в листинге 1.31.

Листинг 1.31. Модуль главного окна программы NumBroadcast

unit NBMain;

interface

uses

 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type TForm1 = class(TForm)

 EditNumber: TEdit;

 BtnBroadcast: TButton;

 LabelNumber: TLabel;

 procedure BtnBroadcastClick(Sender: TObject);

private

 // Здесь будет храниться номер, присвоенный системой

 // глобальному сообщению

 FSendNumberMessage: Cardinal;

protected

 // Так как номер сообщения станет известным только при

 // выполнении программы, объявить обработчик сообщения

 // с помощью директивы message нельзя. Приходится

 // перекрывать метод WndProc и обрабатывать сообщение в

 // нем. Можно было бы вместо WndProc перекрыть метод

 // DefaultHandler, но при этом зарегистрированное

 // сообщение обрабатывалось бы медленнее, потому что

 // сначала выполнялся бы метод WndProc, затем Dispatch

 // пытался бы найти подходящий обработчик среди методов

 // объекта, и лишь затем дело доходило бы до перекрытого

 // DefaultHandler. Но, с другой стороны, при перекрытии

 // WndProc обработка всех сообщений начинается со

 //
сравнения их номера с FSendNumberMessage и вызова

 // унаследованного WndProc, если это другое сообщение.

 // А до DefaultHandler многие сообщения не дойдут, т.к.

 // будут обработаны ранее, и накладные расходы на

 // сравнение и вызов унаследованного метода будут меньше.

 procedure WndProc(var Msg: TMessage); override;

public

 constructor Create(AOwner: TComponent); override;

end;

var

 Form1: TForm1;

implementation

{$R *.dfm}

constructor TForm1.Create(AOwner: TComponent);

begin

 // Регистрируем глобальное сообщение с именем

 // WM_DelphiKingdom_APISample_SendNumber. Имя достаточно

 // длинное и осмысленное, поэтому можно надеяться, что

 // никакое другое приложение не зарегистрирует сообщение с

 // таким же именем. Регистрация сообщения выполняется до

 // вызова унаследованного конструктора, т.к. при

 // выполнении этого конструктора окно получит ряд

 // сообщений, и метод WndProc будет несколько раз вызван.

 // Если вызвать унаследованный конструктор до вызова

 // RegisterWindowMessage, то поле FSendNumberMessage

 // будет иметь присвоенное ему по умолчанию значение 0,

 // а это - код сообщения WM_NULL. Таким образом, если в

 // это время окно получит сообщение WM_NULL, оно будет

 // неправильно обработано. Конечно, вероятность получения

 // WM_NULL во время выполнения унаследованного

 // конструктора крайне мала, но лучше подстраховаться и

 // сделать так, чтобы поле FSendNumberMessage на момент

 // первого вызова WndProc уже имело правильное значение.

 FSendNumberMessage := RegisterWindowMessage('WM_DelphiKingdom_APISample_SendNumber');

 inherited;

 // Здесь мы меняем стиль окна поля ввода, добавляя в него

 // ES_NUMBER. Стиль ES_NUMBER запрещает полю ввода

 // вводить какие-либо символы, кроме цифр. Это уменьшает

Поделиться:
Популярные книги

Игра на чужом поле

Иванов Дмитрий
14. Девяностые
Фантастика:
попаданцы
альтернативная история
5.50
рейтинг книги
Игра на чужом поле

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Кодекс Охотника. Книга VII

Винокуров Юрий
7. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.75
рейтинг книги
Кодекс Охотника. Книга VII

Отмороженный 10.0

Гарцевич Евгений Александрович
10. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный 10.0

Гримуар темного лорда VIII

Грехов Тимофей
8. Гримуар темного лорда
Фантастика:
боевая фантастика
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Гримуар темного лорда VIII

Большие Песцовые радости

Видум Инди
8. Под знаком Песца
Фантастика:
альтернативная история
аниме
5.25
рейтинг книги
Большие Песцовые радости

Кодекс Крови. Книга I

Борзых М.
1. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга I

Идеальный мир для Лекаря 26

Сапфир Олег
26. Лекарь
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 26

Тактик

Земляной Андрей Борисович
2. Офицер
Фантастика:
альтернативная история
7.70
рейтинг книги
Тактик

Диверсант

Вайс Александр
2. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Диверсант

Кодекс Крови. Книга IХ

Борзых М.
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IХ

Битва за Изнанку

Билик Дмитрий Александрович
7. Бедовый
Фантастика:
городское фэнтези
мистика
5.00
рейтинг книги
Битва за Изнанку

Ратник

Ланцов Михаил Алексеевич
3. Помещик
Фантастика:
альтернативная история
7.11
рейтинг книги
Ратник

Темный Лекарь 13

Токсик Саша
13. Темный Лекарь
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Темный Лекарь 13