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

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

Жанры

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

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

Шрифт:

Как раз для подобных случаев и предусмотрена возможность определять свои сообщения, т.к. ни одно из стандартных для наших целей не подходит. Свое сообщение мы будем посылать только одному окну, без широковещания, поэтому для него вполне подходит диапазон сообщений класса. Номер сообщения становится известным на этапе компиляции, поэтому для обработки этого сообщения мы можем применить самый удобный способ написать метод-обработчик с помощью директивы message. С учётом всего этого код выглядит следующим образом (листинг 1.33).

Листинг 1.33. Модуль главной формы программы ButtonDel

unit BDMain;

interface

uses

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

//
Определяем свое сообщение. Константа, добавляемая к

// WM_USER, может иметь произвольное значение в диапазоне

// от 0 до 31743.

const

 WM_DELETEBUTTON = WM_USER + 1;

type TForm1 = class(TForm)

 BtnDeleteSelf: TButton;

 procedure BtnDeleteSelfClick(Sender: TObject);

private

 // Определяем метод - обработчик событий WM_DELETEBUTTON.

 // Ему будет передано управление через Dispatch.

 procedure WMDeleteButton(var Msg: TMessage); message WM_DELETEBUTTON;

public

 { Public declarations }

end;

var

 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BtnDeleteSelfClick(Sender: TObject);

begin

 // Помещаем сообщение WM_DELETEBUTTON в очередь формы.

 // Указатель на объект, который нужно удалить, помещаем

 // в LParam. В 32-разрядных версиях Windows указатель

 // можно помещать как в wParam, так и в lParam, но по

 // традиции, берущей начало в 16-разрядных версиях,

 // указатель обычно передают через lParam.

 PostMessage(Handle, WM_DELETEBUTTON, 0, LParam(BtnDeleteSelf));

 // Здесь принципиально использование PostMessage, а не

 // SendMessage. SendMessage в данном случае привел бы к

 // немедленному вызову оконной процедуры, и метод

 // WMDeleteButton был бы вызван до завершения работы

 // BtnDeleteSelfClick. Это привело бы к тому же

 // результату, что и прямой вызов BtnDeleteSelf.Free.

end;

procedure TForm1.WMDeleteButton(var Msg: TMessage);

begin

 // Просто удаляем объект, указатель на который передан

 // через lParam.

 TObject(Msg.LParam).Free;

end;

end.

Приведенный

здесь способ хорошо работает в такой простой ситуации, но в более сложных случаях может не дать результата. Рассмотрим, например, ситуацию, когда на форме лежат две кнопки:
Button1
и
Button2
. Обработчик нажатия
Button1
содержит длительную операцию, и поэтому в нем вызывается
Application.ProcessMessages
. Обработчик нажатия
Button2
содержит строку
Button1.Free
. Если после запуска программы сразу нажать
Button2
, проблем не возникнет и объект
Button1
будет благополучно удален. Но если сначала нажать
Button1
, а затем —
Button2
, возникнет ошибка. Это произойдёт потому, что нажатие
Button2
будет в данном случае обработано локальной петлей сообщения, и после обработки управление вернется
Button1Click
, а оттуда — в методы уже не существующего объекта
Button1
. Посылка в
Button2Click
сообщения форме здесь не поможет, потому что это сообщение также будет извлечено и обработано локальной петлей. Общего решения таких проблем, видимо, не существует. В сложных случаях можно посоветовать не удалять объект, а просто прятать его (
Visible := False
) — видимый результат для пользователя будет тот же самый.

1.2.7. Пример GDIDraw

Программа GDIDraw демонстрирует некоторые возможности GDI, которые не поддерживаются классом

TCanvas
. Выбраны только те возможности, которые поддерживаются не только в Windows NT/2000/XP, но и в 9x/ME. Окно программы показано на рис. 1.11.

В своей работе программа использует рисунок из стандартных картинок Delphi, предполагая, что эти картинки установлены в папку "С:\Program Files\Common Files\Borland Shared\Images". Если у вас эти картинки установлены в другую папку, или по каким-то причинам вы хотите выбрать другой рисунок, измените обработчик события

OnCreate
формы так, чтобы он загружал рисунок из нужного вам файла. Загруженный рисунок сохраняется в поле
FBitmap
формы.

Рис. 1.11. Окно программы GDIDraw

Основная работа выполняется в обработчике события

OnPaint
формы. Мы здесь будем разбирать этот обработчик не целиком, а по частям в соответствии с тем, что каждая часть рисует. Начнем с надписи Delphi Kingdom в левом верхнем углу окна (листинг 1.34).

Листинг 1.34. Вывод надписи Delphi Kingdom

var

 R: TRect;

...

// Формируем регион, использующийся для отсечения.

// Формируем его только при первом вызове метода, а при

// дальнейших используем созданный ранее. Поле FRgn

// содержит дескриптор этого региона

if FRgn = 0 then

begin

 Canvas.Font.Name := 'Times New Roman';

 Canvas.Font.Style := [fsBold];

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

Черный маг императора 3

Герда Александр
3. Черный маг императора
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора 3

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Пипец Котенку! 3

Майерс Александр
3. РОС: Пипец Котенку!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Пипец Котенку! 3

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Боги, пиво и дурак. Том 6

Горина Юлия Николаевна
6. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 6

Болотник 2

Панченко Андрей Алексеевич
2. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 2

Ты всё ещё моя

Тодорова Елена
4. Под запретом
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Ты всё ещё моя

S-T-I-K-S. Пройти через туман

Елисеев Алексей Станиславович
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.00
рейтинг книги
S-T-I-K-S. Пройти через туман

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Королевская Академия Магии. Неестественный Отбор

Самсонова Наталья
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Королевская Академия Магии. Неестественный Отбор

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

Жребий некроманта. Надежда рода

Решетов Евгений Валерьевич
1. Жребий некроманта
Фантастика:
фэнтези
попаданцы
6.50
рейтинг книги
Жребий некроманта. Надежда рода