* При перепечатке материалов ссылка на 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

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

Организация взаимодействия устройств в сети
Информация о протоколе
Событие OnNeedData
Метод NewColumn
Свойство ColumnTopPosition
Свойство Center
Варианты технологии клиент — сервер
Исполнительные информационные системы (Executive Support System)
DbfFile
Базы данных, СУБД, дифференциальные файлы
Проектирование структуры реляционного хранилища данных
Программное обеспечение электронного офиса
Новые функции
Перекрытый ввод-вывод
Событие BeforePrint для TQuickRep
| 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. Регион сайта: Москва и Санкт-Петербург