Как добавить метод/событие в уже созданный класс?

отредактировано 07:06 Раздел: FastScript
Столкнулся с интересной ситуацией:
кидаю на форму ТfsFormsRTTI1.
Он автоматически добавляет в скрипт некоторые классы и компонеты. Все вроде бы хорошо, но!
Хочу теперь добавить в TComboBox стандартные события (OnChange, OnClick, OnCloseUp и т.д.) а как!? ;)

Пришлось лезть в fs_iformsrtti.pas и править там... все вроде бы заработало, но в голову лезут разные мысли: А что будет при обновлени версии FS? Опять править? ;)

Может, как всегда, есть более простое решение? ;)

Комментарии

  • отредактировано 07:06
    Видимо, есть ;) как добавлять написано в доке, но ты наверно и сам разобрался, раз полез в исходники - это хорошо ;) . А вот править их ИМХО не есть хорошо - я делаю модули-прослойки и в них добавляю функциональность, и проблем с обновлением не возникает.
    В модуль-прослойку добавляем:
     with fsGlobalUnit.FindClass('TComboBox') do
      begin
        AddEvent('OnClick', TfsNotifyEvent);
      end;
    
    Запускаем, скрипт:
    procedure Test(Sender: TObject);
    begin
      ShowMessage(Sender.ClassName);
    end;
      
    var
      F: TForm;
      C: TComboBox;
    begin
      F := TForm.Create(nil);
      try
        C := TComboBox.Create(F);
        C.Parent := F;
        C.Items.Add('Item');
        C.ItemIndex := 0;
        C.OnClick := @Test;
        F.OnClick := @Test;
        F.ShowModal;
      finally
        F.Free;
      end;
    end.
    
    Работает...
  • отредактировано 07:06
    OnClick есть у всех контролов, а вот OnChange/OnCloseUp добавлю в след. релизе...
  • отредактировано 07:06
    Да, это от водки, это пройдет ;) OnClick уже есть и ничего добавлять не нужно было, просто надо было заполнить ComboBox.Items и уж потом кликать на список 8-)
  • отредактировано 07:06
    Спасибо, что просветили про FindClass, как я его сам не нашел.?!. ;)
    написал:
    А вот править их ИМХО не есть хорошо - я делаю модули-прослойки и в них добавляю функциональность, и проблем с обновлением не возникает.

    Я тоже так делаю, поэтому и возник вопрос. Что называется нутром почувствовал, что делаю не так как надо... ;)

    Попутно возник еще один вопрос:
    А как проверить, может этот метод в классе уже описан? Не привидет ли это к скрытым ошибкам..? (Как я понимаю, мы сталкнемня с этим, когда появится новая версия FS, т.к. она явно расширится).
  • отредактировано 07:06
    Hi, Wizdom!
    Если я правильно понял:
    1.есть модуль-обертка fs_xxx.pas
    2.есть наша надстройка my_xxx.pas c какими-то добавлениями.
    Мы получаем обновленный fs_xxx.pas - как проверить на наличие/отстутствие конфликтов с нашей надстройкой my_xxx.pas?
    ИМХО руками и глазами, заодно лишний раз просмотреть исходник, может найдется еще что полезное (вроде FindClass ;) )
  • отредактировано 07:06
    написал:
    ...ИМХО руками и глазами, заодно лишний раз просмотреть исходник...
    Хм... интересный ты предлагаешь подход - проверка глазами.. ;)
    Исходники бесспорно проссматривать нужно, с этим споров нет, но как на счет человеческого фактора?
    ИМХО, сусанин, не туда ты меня повел... ;) Я отказываюсь все проверять глазами... не те времена... ;)

    Предлагаю внести в ФС небольшое улучшение: при вызове методов AddClass, AddMethod или AddEvent (ну, и всех остальных Addxxx) чтобы сначала шла проверка, а есть ли такой класс/метод/событие/ххх, если нет, то добавлять, нет - тихо молчать (в крайнем случае, выдавать сообщение нефатальное)...

    Если же ничего страшного в повторном объявлении нет, то и фиг с ним... ;)

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.