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


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

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

Язык программирования
Создание сокета
Пространства имен в Delphi
Управляющие средства пользовательского интерфейса
Свойство Units
MMX и SSE2
Событие OnEndPage
RepageIndexFile
Добавление текста и полей данных
Печать из полей базы данных
IndexFieldNames
Базы данных, СУБД, дифференциальные файлы
Редактор кода
Конструкция IF-ELSE
RestructureTable
| 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


     



Rambler's Top100

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

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