Nov 03

Полезное применение хелперов

Как и обещал - выкладываю способ использования хелперов в Delphi, вместо правки исходников. Представим ситуацию, когда необходимо изменить какой-то базовый класс, для того, чтобы добавить новый функционал (или поправить баги) для всех наследуемых, от него, классов. Например, TStrings. Добавив что-то в него, можно это использовать в TStringList, а с ним и в TMemo, например.

Для простоты возьмем такой пример: необходимо добавить функцию Add, в которую можно передать что угодно и переданные данные будут добавлены в список. Согласитесь, данная задача не разрешима в D7, без наследования или модификации стандартных классов. Но данная задача легко разрешима, при использовании хелперов, в новых версиях Delphi:

unit uStringsHelper; interface uses   Classes; type   TStringsHelper = class helper for TStrings   public     function Add(const V: Variant): Integer; overload;     function Add(const Args: array of Variant): Integer; overload;   end; implementation uses   Variants; function TStringsHelper.Add(const Args: array of variant): Integer; var   Idx: Integer; begin   Result := -1;   lTemp := EmptyStr;   for Idx := Low(Args) to High(Args) do   begin     if lTemp <> EmptyStr then       lTemp := lTemp + sLineBreak;     lTemp := lTemp + VarToStr(Args[Idx]);   end;   if lTemp <> EmptyStr then     Result := Add(lTemp); end; function TStringsHelper.Add(const V: Variant): Integer; begin   Result := Add([V]); end; end.

А вот пример использования:

with ListBox.Items do
begin
Add('delphist.ru');
Add(['Первая строка', 'Вторая строка', 'Третья строка']);
Add(2008);
Add(False);
end;


  1. aktuba
     Add karma Subtract karma  +0
    Цитировать.
    Комментарий автора

    Пришлось удалить плагин WM-SpamFree, т.к. вообще не добавлялись комментарии. Буду разбираться.

    1
  2. Alexo
     Add karma Subtract karma  +0
    Цитировать.

    Хорошая статья.

    Просьба сделать что нибуть с кодом, как то по кравивее его представлять) типа такого

    with ListBox.Items do
    begin
    Add(’delphist.ru’);
    Add([’Первая строка’, ‘Вторая строка’, ‘Третья строка’]);
    Add(2008);
    Add(False);
    end;

    Красивее и читать удобнее. (ИМХО)

    2
  3. Alexo
     Add karma Subtract karma  +2
    Цитировать.

    Хм в пред коменте должны были быть коды и соотвествующие стили, а получился просто текст.

    3
  4. aktuba
     Add karma Subtract karma  +0
    Цитировать.
    Комментарий автора

    Спасибо, учту… Надо будет прикрутить плагин подсветки синтаксиса.

    4
  5. bose
     Add karma Subtract karma  +0
    Цитировать.

    Отступов и пустых строк для разделения секций.

    В принципе кода мало и так понятно, но читать не очень удобно =(

    5
  6. aktuba
     Add karma Subtract karma  +0
    Цитировать.
    Комментарий автора

    Поправил на скорую руку…

    6
  7. bose
     Add karma Subtract karma  +0
    Цитировать.

    Теперь кода в 2 раза больше 😀

    7
  8. aktuba
     Add karma Subtract karma  +0
    Цитировать.
    Комментарий автора

    Ну я же сказал – на скорую руку… Надо будет заняться на днях этим вопросом…

    8
  9. Surikov
     Add karma Subtract karma  +0
    Цитировать.

    Полезный совет: открой у себя в сайте-блоге рубрику типа «самые горячие обсуждения» ну или подобное. Там думаю, можно будет комментировать наиболее обсуждаемые темы блога…

    9
  10. diablo
     Add karma Subtract karma  +0
    Цитировать.

    Мне нужно расширить возможности TAdoQuery, а точнее параметров. Написал вот такую фигню:

    TParameterHelper = class helper for TParameter
    private
    function GetMyParam: integer; overload;
    procedure SetMyParam(const Value: integer); overload;
    published
    property MyParam: integerread GetMyParam write SetMyParam;
    end;

    Зарегистрировал, свойство появилось у компонента, если обращатся в тексте, но в визуальном дизайнере – облом. Ваши предложения?

    10
  11. Валерий
     Add karma Subtract karma  +0
    Цитировать.

    2 diablo, А в редакторе оно и не появится, тут без наследования и добавления нового компонента в VCL не обойтись.

    2 aktuba, мне кажется, что хелперы применять тоже нужно с оговоркой “не каждый день”. То есть возможность есть, но на крайний случай, чтобы не лезть в исходники VCL. Поскольку существуют свои проблемы при их использовании. Но этот способ бесспорно лучше, чем ковыряться (по другому и не скажешь) в исходниках, как обсуждалось ранее.

    11
  12. aktuba
     Add karma Subtract karma  +0
    Цитировать.
    Комментарий автора

    2diablo: как уже ответили – ты создаешь код не для визуализации, а для обработки. Если тебе необходимы доп.свойства в редакторе – создай наследника и добавь его в палитру компонентов.

    2Валерий: на то они и хелперы (помощники, с английского). статья дана для того, чтобы объяснить новичкам, что можно реализовать доп.функционал, не изменяя исходников.

    12
  13. crystalbit
     Add karma Subtract karma  +0
    Цитировать.

    Дельфи меняется, имхо всё больше на С++ становится похож

    какой плагин для отображения кода стоит, если не секрет?)

    13
  14. мeнимбaлaм
     Add karma Subtract karma  +0
    Цитировать.

    Все-таки по-настоящему нравится мне Ваш блог. Всегда занятно читать, включая эту тему. 🙂

    14
  15. aktuba
     Add karma Subtract karma  +0
    Цитировать.

    Блин,продал сайт с надеждой, что его будут развивать… Оказалось, зря =(

    15

Поделитесь вашими мыслями



Ссылки в комментариях будут свободны от nofollow.

Поддерживаемые теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Ссылки в комментариях будут свободны от nofollow.

Детали для круглых воздуховодов. В наличии имеется отвод 45 градусов штампованный. Как принимать Казеиновый протеин forcefit.com.ua.
-->