Имя Пароль
Зарегистрироваться


* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна! RSS



Сабклассинг окон на VCL
19 февраля 2009

В VCL на компонентном уровне сабклассинг реализуется достаточно просто и быстро. Его использование предпочтительней, чем использование сабклассинга на WinAPI (разумеется, при программировании с VCL) - всегда, если возможно, делайте сабклассинг именно через VCL. Для сабклассирования оконного компонента необходимо расширить его функциональность путём добавления обработчика желаемого сообщения, либо через перекрытие оконной процедуры компонента.
Ниже приведен пример сабклассирования компонента TEdit таким образом, чтобы последний не реагировал на вставку текста:
код Pascal/Delphi

Unit UMain;

Interface

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

Type
TMainForm = Class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
Private
{ Private declarations }
Public
{ Public declarations }
End;

{ Новый класс с дополнительным методом,
который вызвается при сообщении WM_PASTE }

TNewEdit = Class(TEdit)
Protected
{ Обработчик сообщения }
Procedure WMCopy(Var Msg: TWMPaste); Message WM_PASTE;
End;

Var
MainForm: TMainForm;
{ Экземпляр нового класса }
Edit: TNewEdit;

Implementation

{$R *.dfm}

{ TNewEdit }

Procedure TNewEdit.WMCopy(Var Msg: TWMPaste);
Begin
{ Игнорируем сообщение }
Msg.Result := 0;
End;

Procedure TMainForm.FormCreate(Sender: TObject);
Begin
{ Создание и размещение компонента на форме }
Edit := TNewEdit.Create(Self);
Edit.Parent := Self;
Edit.Left := 8;
Edit.Top := 8;
Edit.Width := MainForm.Width - 23;
{ Следующий метод работать не будет }
Edit.PasteFromClipboard;
End;

Procedure TMainForm.FormDestroy(Sender: TObject);
Begin
Edit.Free;
End;

End.

Таким образом, чтобы засабклассировать оконный компонент, нужно просто реализовать свой обработчик сообщений. Есть еще один способ, который заключается в модификации оконной процедуры компонента на VCL-уровне:
код Pascal/Delphi

Unit UMain;

Interface

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

Type
TMainForm = Class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
Private
{ Private declarations }
Public
{ Public declarations }
End;

TNewEdit = Class(TEdit)
Protected
{ Перекрытая оконная процедура компонента }
Procedure WndProc(Var Msg: TMessage); Override;
End;

Var
MainForm: TMainForm;
{ Экземпляр нового класса }
Edit: TNewEdit;

Implementation

{$R *.dfm}

{ TNewEdit }

Procedure TNewEdit.WndProc(Var Msg: TMessage);
Begin
Case Msg.Msg Of
WM_PASTE:
Begin
Msg.Result := 0;
{ Звуковой сигнал, оповещающий пользователя о
невозможности вставки текста }
MessageBeep(0);
{ Выход после обработки необходим, чтобы
оригинальная оконная процедура не имела
возможности обработать WM_PASTE; в противном
случае вставка текста всё равно произойдёт }
Exit;
End;
End;
{ Не забывайте вызывать унаследованную оконную процедуру }
Inherited WndProc(Msg);
End;

Procedure TMainForm.FormCreate(Sender: TObject);
Begin
{ Создание и размещение компонента на форме }
Edit := TNewEdit.Create(Self);
Edit.Parent := Self;
Edit.Left := 8;
Edit.Top := 8;
Edit.Width := MainForm.Width - 23;
{ Следующий метод работать не будет }
Edit.PasteFromClipboard;
End;

Procedure TMainForm.FormDestroy(Sender: TObject);
Begin
Edit.Free;
End;

End.

Этот способ по функциональности ничем не отличается от первого.

Вот и всё! Думаю, что Вы разобрались в примерах и мы можем переходить к сабклассингу средствами Windows API. Ту часть кода примеров, которые не относятся к теме статьи, я снабдил краткими комментариями.


Теги: Borland Delphi

Статьи по теме:

Асинхронный режим, основанный на сообщениях
AbsolutePath
Сабклассинг
TableLevel
Географические информационные системы (Geographical Information System)
Событие BeforePrint для TQuickRep
Принципы построения ЛВС
Настольные издательские системы
Поиск пространства имен
Изображения, хранящие в таблицах
Интеллектуальный анализ данных (ИАД)
ShowDeleted
Свойство Printer
DateTimeHandling
Выключение секций
| Borland Delphi | ext |
 


Пн Вт Ср Чт Пт Сб Вс
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31


     



Rambler's Top100

Данный сайт или домен продается ICQ: 403-353-727

© 2009 Seoliga.ru | Borland Delphi | Сабклассинг окон на VCL. Регион сайта: Москва и Санкт-Петербург