Карта сайтаСсылкиКонтакты

Расширение возможности компонентов

PDF Печать
Статьи

Вам когда-нибудь нужно было для определенного управления Delphi, типа TButton иметь еще одно свойство или метод, который "должен быть" в Вашем приложении?

Опытные Delphi разработчики, когда нуждаются в TMySuperButton искали бы VCL управление третьих лиц или бы попробовали создать такой управление.
А что, если Вы не хотите иметь этот 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.


 

Добавить комментарий


Защитный код
Обновить