Расширение возможности компонентов
А что, если Вы не хотите иметь этот MySuperButton постоянно в Палитре Компонентов, так как Вам это нужно только для отдельного приложения, которое Вы разрабатываете?
И даже более... как относительно наличия TButton с большим количеством свойств и методов, определенного поведения, и не TMySuperButton? Как относительно заявления, что TButton без проблем может создать полученный класс с другим именем? Большинство новичков не знаем, что они "не" создают их собственное управление, а получают его из существуюещго VCL.
Delphi Interceptor Classes
Сначала, чтобы иметь два класса с одним и тем же именем, возможно в Delphi, если эти два класса находятся в различных модулях.
Затем, нужно следующее объявление:
type TButton = class(StdCtrls.TButton)
Вышеупомянутый код создает класс перехватчика для управления TButton, расширяя оригинальный TButton, объявленный в модуле StdCtrls VCL.
Наконец, это объявление должно быть помещено в отдельный модуль.
Наиболее важный модуль, в котором находится класс перехватчика, должен быть перечислен в *uses* после определения основного класса.
TButton = class(TButton) - an Interceptor Class Example
Здесь рассматривается один класс перехватчика для TButton.
Добавлено свойство Public - LastClickTime. Процедура Click первоначального TButton отменена - Click генерирует событие OnClick.
Используя отмененную процедуру Click, наш TButton не будет позволять выполнять обработчик события OnClick, если последний щелчок был произведен менее двух секунд назад, будет только Beep.
Вот код примера:
unit button_interceptor interface uses stdctrls, sysutils, DateUtils; type TButton = class(stdctrls.TButton) private fLastClickTime: TDateTime; public procedure Click; override; public property LastClickTime : TDateTime read fLastClickTime write fLastClickTime; end; implementation procedure TButton.Click; const ClickWaitPeriod = 2; var clickTime : TDateTime; begin clickTime := Now; if SecondsBetween(clickTime, LastClickTIme) > ClickWaitPeriod then inherited else Beep; LastClickTime := clickTime; end; end.
Теперь, поместите стандартную кнопку TButton на форму. Прикрепите какой-либо обработчик события к OnClick.
Важно: добавьте модуль button_interceptor в список uses в самый конец, или по крайней мере после модуля StdCtrls!
Щелкните кнопку, обратите внимание, что код выполняется только тогда, когда Вы подождете две секунды после последнего щелчка. Вот так Вы легко сможете расширять возможности классов Delphi, добавляя дополнительные свойства и методы без необходимости создавать новые классы и иметь их в палитре компонентов.
Ах, да, чуть не забыл, обратите внимание, что когда Вы напечатаете Button1, выскочит список свойств и методов, Вы увидите добавленный LastButtonClick, как будто он принадлежит сдандартному TButton в Delphi.
Также учтите, что Вы можете использовать перехватчик не только, чтобы расширить управления VCL, но и любые классы Delphi.
Комментарии