* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Сабклассинг окон на VCL
19 февраля 2009
В VCL на компонентном уровне сабклассинг реализуется достаточно просто и быстро. Его использование предпочтительней, чем использование сабклассинга на WinAPI (разумеется, при программировании с VCL) - всегда, если возможно, делайте сабклассинг именно через VCL. Для сабклассирования оконного компонента необходимо расширить его функциональность путём добавления обработчика желаемого сообщения, либо через перекрытие оконной процедуры компонента.
Ниже приведен пример сабклассирования компонента TEdit таким образом, чтобы последний не реагировал на вставку текста: код Pascal/Delphi
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
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. Ту часть кода примеров, которые не относятся к теме статьи, я снабдил краткими комментариями.