О чём не пишут в книгах по 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 запрещает полю ввода
// вводить какие-либо символы, кроме цифр. Это уменьшает
Поделиться:
Популярные книги
Игра на чужом поле
14. Девяностые
Фантастика:
попаданцы
альтернативная история
5.50
рейтинг книги
Мастер...
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Кодекс Охотника. Книга VII
7. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.75
рейтинг книги
Отмороженный 10.0
10. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Гримуар темного лорда VIII
8. Гримуар темного лорда
Фантастика:
боевая фантастика
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Большие Песцовые радости
8. Под знаком Песца
Фантастика:
альтернативная история
аниме
5.25
рейтинг книги
Кодекс Крови. Книга I
1. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 26
26. Лекарь
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Тактик
2. Офицер
Фантастика:
альтернативная история
7.70
рейтинг книги
Диверсант
2. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Кодекс Крови. Книга IХ
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Битва за Изнанку
7. Бедовый
Фантастика:
городское фэнтези
мистика
5.00
рейтинг книги
Ратник
3. Помещик
Фантастика:
альтернативная история
7.11
рейтинг книги
Темный Лекарь 13
13. Темный Лекарь
Фантастика:
попаданцы
аниме
фэнтези
5.00