Конференция "Компоненты" » IDesigner.GetMethods для Run-Time [D7, Win2k, WinXP]
 
  • Серж © (16.02.09 04:34) [0]
    Требуется получить в Run-Time список обработчиков событий, совместимых по формату с определенным типом события.

    В Design-Time это делает IDesign.GetMethods, но найти его реализацию не получилось.

    Аналогичный вопрос задавался на Королевстве Delphi, но окончательный ответ получен не был. Сообщили только как можно получить список всех обработчиков событий в классе.
  • Jack128_ (16.02.09 09:46) [1]
    ну так rtti есть, в чем проблема? в структуре TTypeData по тегу tkMethod вся необходимая информация вроде есть..
  • Jack128_ (16.02.09 09:52) [2]
    А, стоп, не на тот вопрос отвечал :-)  GetMethods скорее всего парсит сорцы, так что его сорцы тебе не помогут..
  • DimaBr © (16.02.09 09:59) [3]

    procedure TForm1.Button2Click(Sender: TObject);
    begin
     Get(Button1,TypeInfo(TNotifyEvent));
    end;

    procedure TForm1.Get(AObject: TObject; P: PTypeInfo);
    var PropList: PPropList;
       i: integer;
    begin
     PropList := AllocMem(SizeOf(PropList^));
     i := 0;
     try
      GetPropList(AObject.ClassInfo, [tkMethod], PropList);
      while (PropList^[i] <> Nil) and (i < High(PropList^)) do begin
         if P = PropList^[i].PropType^ then
          Memo1.Lines.Add(PropList^[i].Name + ': ' + PropList^[i].PropType^.Name);
        Inc(i);
      end;
     finally
      FreeMem(PropList);
     end;
    end;

  • Jack128_ (16.02.09 10:01) [4]
    Хм.. Посмотри в районе модулей ObjAuto/ObjComAuto.  Мне кажется тут мона что то нарыть..
  • Jack128_ (16.02.09 10:04) [5]

    > DimaBr ©   (16.02.09 09:59) [3]

    ты вернул СВОЙСТВА, а нужно методы, которые по сигнатуре подходят под эти свойства.  По крайней мере я так понял этот вопрос.
  • Игорь Шевченко © (16.02.09 11:28) [6]
    Нельзя, имена методов, пусть даже и обработчиков событий, не хранятся
  • icWasya © (16.02.09 14:30) [7]
    У Published - методов имена хранятся.
    TMethodProperty.GetFormMethodName
  • Сергей М. © (16.02.09 16:14) [8]

    > У Published - методов имена хранятся


    Толку от этого ноль.
    Автору нужно не имя метода, а его прототип, так как он фигурировал в дизайн-тайм в исх.тексте.
  • DimaBr © (16.02.09 16:21) [9]
    Хотелось бы автора услышать, что именно ему нужно
  • Игорь Шевченко © (16.02.09 17:37) [10]
    icWasya ©   (16.02.09 14:30) [7]

    У published хранятся.
  • DimaBr © (17.02.09 09:35) [11]
    Судя по дате вопроса на королевстве (24-03-2006 22:18), оно уже никому не нужно
  • Серж © (18.02.09 04:08) [12]
    to DimaBr: Спасибо за текст исходника. Попробую. Долго не обращался к данному вопросу потому, что были и другие аспекты задачи.

    to Jack128_: По тегу tkMethod, как я понял, хранятся имена свойств-событий, т.е. onClick, onDblClick и т.д. Мне же нужны обработчики.
  • Сергей М. © (18.02.09 10:07) [13]

    > Серж ©   (18.02.09 04:08) [12]


    > Мне же нужны обработчики


    Такая информация в ран-тайм недоступна и не может быть доступна в принципе, ибо свойству-событию в ран-тайм в кач-ве значения поля TMethod.Code может быть назначен любой адрес. Последняя по времени проверка на корректность прототипа назначенного метода-обработчика осуществляется в компайл-тайм, далее все на совести разработчика.
  • Jack128_ (19.02.09 10:49) [14]
    Для published методов доступны и имена, и скорее всего прототип.


    > Jack128_   (16.02.09 10:01) [4]
    > Хм.. Посмотри в районе модулей ObjAuto/ObjComAuto.  Мне
    > кажется тут мона что то нарыть..



    >
    > В Design-Time это делает IDesign.GetMethods,

    если именно на IDesign.GetMethods - то только published методы должны интересовать..
  • Сергей М. © (19.02.09 12:54) [15]

    > Jack128_   (19.02.09 10:49) [14]


    > и скорее всего прототип


    Откуда прототипу взяться-то в ран-тайм ?
    Свойство-событие в ран-тайм "обезличено" - его фактическое значение имеет тип TMethod, поле Code этой структуры в ран-тайм может смотреть куда угодно
  • Jack128_ (19.02.09 16:50) [16]

    > Откуда прототипу взяться-то в ран-тайм ?

    От туда же, откуда имя published метода берется..
  • Игорь Шевченко © (20.02.09 00:49) [17]

    > Откуда прототипу взяться-то в ран-тайм ?


    Из TTypeInfo ?
  • Серж © (20.02.09 04:49) [18]
    Поясню "на пальцах":

    1. Заходим на вкладку "Events" Object инспектора.

    2. Кликаем на стрелку справа от имени обработчика.

    3. Открывается список обработчиков, совместимых по типу с данным событием.

    Вопрос: как ЭТОТ список получить в Run-time?

    P.S. На королевстве мне объяснили, как получить список ВСЕХ обработчиков, но остался вопрос о том, как из него отобрать только совместимые с событием?

    С уважением.
  • DimaBr © (20.02.09 12:48) [19]
    Посмотрите этот блог, может поможет
    http://hallvards.blogspot.com/2006/09/extended-class-rtti.html
 
Конференция "Компоненты" » IDesigner.GetMethods для Run-Time [D7, Win2k, WinXP]
Есть новые Нет новых   [134464   +62][b:0][p:0.001]