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

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

Жанры

О чём не пишут в книгах по 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 запрещает полю ввода

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

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

Вкус ледяного поцелуя

Полякова Татьяна Викторовна
2. Ольга Рязанцева
Детективы:
криминальные детективы
9.08
рейтинг книги
Вкус ледяного поцелуя

Проблема майора Багирова

Майер Кристина
1. Спецназ
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Проблема майора Багирова

Прометей: владыка моря

Рави Ивар
5. Прометей
Фантастика:
фэнтези
5.97
рейтинг книги
Прометей: владыка моря

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

(Не)зачёт, Дарья Сергеевна!

Рам Янка
8. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
(Не)зачёт, Дарья Сергеевна!

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Дракон с подарком

Суббота Светлана
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Дракон с подарком

Отвергнутая невеста генерала драконов

Лунёва Мария
5. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Отвергнутая невеста генерала драконов

Случайная жена для лорда Дракона

Волконская Оксана
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Случайная жена для лорда Дракона

Тройняшки не по плану. Идеальный генофонд

Лесневская Вероника
Роковые подмены
Любовные романы:
современные любовные романы
6.80
рейтинг книги
Тройняшки не по плану. Идеальный генофонд

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

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

Лейтенант космического флота

Борчанинов Геннадий
1. Звезды на погонах
Фантастика:
боевая фантастика
космическая фантастика
космоопера
рпг
фэнтези
фантастика: прочее
5.00
рейтинг книги
Лейтенант космического флота

Гарем на шагоходе. Том 5

Гремлинов Гриша
5. Волк и его волчицы
Фантастика:
боевая фантастика
фэнтези
5.00
рейтинг книги
Гарем на шагоходе. Том 5

Матабар III

Клеванский Кирилл Сергеевич
3. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар III