Перехват классов в Delphi
Ну а если Вам не нужно, чтобы TSuperBtn находился на Палитре Компонентов и нужен только для этого приложения? Как получить TButton с большим количеством свойств и методов, но не TSuperBtn? И как расширить возможности TButton без необходимости создавать унаследованный класс с другим именем?
Это можно сделать при помощи вспомогательного класса, но вспомогательный класс будет содержать только вновь добавленные свойства и методы.
Большинство начинающих не знают, что они МОГУТ создавать свои собственные пользовательские элементы управления на основе существующего набора VCL, создавая, так называемый класс-перехватчик, который будет иметь то же самое имя, что и основной класс.
Перехватчик классов Delphi
Во-первых, два класса с одним именем можно применять в Delphi, если эти два класса находятся в разных модулях. Поэтому следующее объявление является правильным:
type TButton = class(StdCtrls.TButton)
Приведенный выше код создает перехватчик класса для управления TButton, оригинал TButton объявлен в модуле StdCtrls библиотеки VCL. К тому же это объявление должно быть помещено в отдельный модуль. И самое главное: модуль перехватчика классов должен быть объявлен ПОСЛЕ перечисления модуля основного класса.
uses { … } StdCtrls, Unit2 { … }
Пример перехватчика класса TButton = class(StdCtrls.TButton)
Вот один перехватчик класса для TButton.
Добавляем новое свойство Text, которое будет хранить строку, а также переопределим процедуру Click, которая будет менять надпись на кнопке, а также выполнять свою основную деятельность.
unit Unit2; interface uses StdCtrls, SysUtils; type TButton = class(StdCtrls.TButton) private fText: string; public procedure Click; override; property Text: string read fText write fText; end; implementation { TButton } procedure TButton.Click; begin Caption:= 'Это кнопка'; inherited; end; end.
Теперь поместите кнопку на форму и добавьте модуль Unit2 в конце перечисления модулей в разделе uses, главное, чтобы это было после StdCtrls.
В форме для примера у меня такой код:
procedure TForm1.Button1Click(Sender: TObject); begin Button1.Text:= 'Hello'; Caption:= Button1.Text; end;
При выполнении программы и нажатии на кнопку, кнопка поменяет свою надпись, а форма – заголовок. Вариантов использования перехватчика классов может быть много, в зависимости от Ваших потребностей и возможностей.
Ну, пожалуй, это все, основные моменты рассмотрены. Если кто и не знал о перехвате классов, то начало положено. Также заметьте, что это может быть применено не только к компонентам VCL, но и к любым классам Delphi.
Комментарии