Страницы

вторник, 21 апреля 2009 г.

Пример добавляющий поддержку новых интерфейсов в существующие классы

Недавно писал, как здорово было бы, если бы в Delphi были определены интерфейсы для базовых классов. Например, если бы все контролы, имеющие свойство Caption(например TLabel; TButton; TCheckBox; TRadioButton; TGroupBox; TBitBtn; TSpeedButton), реализовывали интерфейс ICaptionedControl с методом GetCaption. Подробнее читайте здесь.

Я просто мечтал, а Алексей Казанцев взял и показал, что подобное можно реализовать уже сейчас, и даже выложил у себя в блоге пример, показывающий, как добавить поддержку интерфейса ICaptionedControl для классов TControl и TPanel. Реализация сделана с помощью хука на метод TObject.GetInterface и представляет собой практически готовое решение. =)))

p.s. я до сих пор не могу поверить своим глазам. =) Это же действительно работает! O_o

p.p.s. Даже код читать – одно удовольствие.

7 комментариев:

  1. Ну вот, осталось теперь написать интерфейсы для стандартных классов... и отправить в CodeGear с пометкой "добавьте, пожалуйсто, в VCL!" :D

    ОтветитьУдалить
  2. Теоретически да. :D


    Не уверен, но Джефф Оверкэш кажется, где-то говорил, что у Delphi Team есть какая-то политика, запрещающая использовать присланный им код.

    ОтветитьУдалить
  3. Не так давно, я просматривал какие-то сорцы из недр VCL и там была куча кода где авторами значились наши соотечественники.

    ОтветитьУдалить
  4. Да, действительно, что-то сомнительно это утверждение. Иначе не видать бы нам кода из FastMM, FastCode, функций округления John Herbster и тому подобных приятностей...

    ОтветитьУдалить
  5. Я имел в виду код, который юзеры предлагают в ньюзгруппах. Мне кажется, что где-то там я это утверждение и видел, но найти не смог. Впрочем, я могу ошибаться за давностью, да к тому же это и непринципиально.
    FastMM - старый продукт у которого есть своя лицензия, которая, вероятно, позволила включить его в состав Delphi.
    Забавно, не знал, что FastCode тоже включён в VCL.

    ОтветитьУдалить
  6. В Jedi VCL этим вроде ещё во времена Delphi 7 анимались :-)

    Классы TJvEx.....

    ОтветитьУдалить
  7. Компоненты JVCL поддерживают какие-то свои интерфейсы, да.
    Имхо, главный выигрыш от этих интерфейсов будет только в том случае, если все интерфейсы будут объявлены и реализованы прямо в VCL. Таким образом, у сторонних разработчиков появится возможность включить поддержку тех же интерфейсов в свои классы/компоненты, сделав процесс перехода с одной либы на другую более прозрачным. И использовать всё это хозяйство станет проще.

    ОтветитьУдалить