-
Требуется получить в Run-Time список обработчиков событий, совместимых по формату с определенным типом события.
В Design-Time это делает IDesign.GetMethods, но найти его реализацию не получилось.
Аналогичный вопрос задавался на Королевстве Delphi, но окончательный ответ получен не был. Сообщили только как можно получить список всех обработчиков событий в классе.
-
ну так rtti есть, в чем проблема? в структуре TTypeData по тегу tkMethod вся необходимая информация вроде есть..
-
А, стоп, не на тот вопрос отвечал :-) GetMethods скорее всего парсит сорцы, так что его сорцы тебе не помогут..
-
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;
-
Хм.. Посмотри в районе модулей ObjAuto/ObjComAuto. Мне кажется тут мона что то нарыть..
-
> DimaBr © (16.02.09 09:59) [3]
ты вернул СВОЙСТВА, а нужно методы, которые по сигнатуре подходят под эти свойства. По крайней мере я так понял этот вопрос.
-
Нельзя, имена методов, пусть даже и обработчиков событий, не хранятся
-
У Published - методов имена хранятся.
TMethodProperty.GetFormMethodName
-
> У Published - методов имена хранятся
Толку от этого ноль.
Автору нужно не имя метода, а его прототип, так как он фигурировал в дизайн-тайм в исх.тексте.
-
Хотелось бы автора услышать, что именно ему нужно
-
icWasya © (16.02.09 14:30) [7]
У published хранятся.
-
Судя по дате вопроса на королевстве (24-03-2006 22:18), оно уже никому не нужно
-
to DimaBr: Спасибо за текст исходника. Попробую. Долго не обращался к данному вопросу потому, что были и другие аспекты задачи.
to Jack128_: По тегу tkMethod, как я понял, хранятся имена свойств-событий, т.е. onClick, onDblClick и т.д. Мне же нужны обработчики.
-
> Серж © (18.02.09 04:08) [12]
> Мне же нужны обработчики
Такая информация в ран-тайм недоступна и не может быть доступна в принципе, ибо свойству-событию в ран-тайм в кач-ве значения поля TMethod.Code может быть назначен любой адрес. Последняя по времени проверка на корректность прототипа назначенного метода-обработчика осуществляется в компайл-тайм, далее все на совести разработчика.
-
Для published методов доступны и имена, и скорее всего прототип.
> Jack128_ (16.02.09 10:01) [4]
> Хм.. Посмотри в районе модулей ObjAuto/ObjComAuto. Мне
> кажется тут мона что то нарыть..
>
> В Design-Time это делает IDesign.GetMethods,
если именно на IDesign.GetMethods - то только published методы должны интересовать..
-
> Jack128_ (19.02.09 10:49) [14]
> и скорее всего прототип
Откуда прототипу взяться-то в ран-тайм ?
Свойство-событие в ран-тайм "обезличено" - его фактическое значение имеет тип TMethod, поле Code этой структуры в ран-тайм может смотреть куда угодно
-
> Откуда прототипу взяться-то в ран-тайм ?
От туда же, откуда имя published метода берется..
-
> Откуда прототипу взяться-то в ран-тайм ?
Из TTypeInfo ?
-
Поясню "на пальцах":
1. Заходим на вкладку "Events" Object инспектора.
2. Кликаем на стрелку справа от имени обработчика.
3. Открывается список обработчиков, совместимых по типу с данным событием.
Вопрос: как ЭТОТ список получить в Run-time?
P.S. На королевстве мне объяснили, как получить список ВСЕХ обработчиков, но остался вопрос о том, как из него отобрать только совместимые с событием?
С уважением.
-