О чём не пишут в книгах по Delphi
Шрифт:
Для завершения обработки сообщения
WM_PAINT
осталось только вызвать EndPaint
, разумеется, только в том случае, если BeginPaint
вызывали мы сами. И последнее, что мы должны сделать, — это передать все остальные сообщения стандартному обработчику. После этого программа PanelMsg готова.
1.2.5. Пример NumBroadcast
Программа NumBroadcast демонстрирует широковещательную рассылку глобальных сообщений. Окно программы показано на рис. 1.10.
Рис 1.10.
Для того чтобы увидеть, как работает программа, нужно запустить несколько ее экземпляров. После ввода числа и нажатия кнопки Разослать любому из экземпляров программы число под кнопкой меняется во всех экземплярах. Чтобы добиться такого эффекта, программа 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 запрещает полю ввода
// вводить какие-либо символы, кроме цифр. Это уменьшает
Поделиться:
Популярные книги
Черный маг императора 3
3. Черный маг императора
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Повелитель механического легиона. Том VIII
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Пипец Котенку! 3
3. РОС: Пипец Котенку!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Разбуди меня
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Боги, пиво и дурак. Том 6
6. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Болотник 2
2. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Ты всё ещё моя
4. Под запретом
Любовные романы:
современные любовные романы
7.00
рейтинг книги
S-T-I-K-S. Пройти через туман
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.00
рейтинг книги
Имя нам Легион. Том 4
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Сводный гад
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Я князь. Книга XVIII
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Королевская Академия Магии. Неестественный Отбор
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Последняя Арена 6
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Жребий некроманта. Надежда рода
1. Жребий некроманта
Фантастика:
фэнтези
попаданцы
6.50