|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Переназначение методов в run-time
Всем привет!
На досуге работаю над чем-то вроде движка, который позволяет посредством интерфейса командной строки управлять внутренностями программы. Например, есть возможность прописать в консоли что-то типа "Form1.Button1.Left:=Form1.Button1.Left - 10", и указанный объект (Button1) будет смещен на 10 пикселей влево, хвала механизму RTTI и несложному самодельному интерпретатору команд. Однако, продвижение в работе застопорилось, как только я решил добавить возможность переприсваивать значения не только полей, но и методов (скажем, чтобы поддерживались и работали также команды вида "Form1.Button1.OnClick:=Form1.Button2.OnClick" ). Оказалось, решение проблемы неинтуитивно. Можно, конечно, сделать примитивно: Код:
TargetObject: TControl; MethodName: string; NewMethodAddress: Pointer; {...} MethodName:=UpperCase(MethodName); if MethodName = 'ONCLICK' then @TargetObject.OnClick:=@NewMethodAddress else if MethodName = 'ONMOUSEDOWN' then @TargetObject.OnMouseDown:=@NewMethodAddress else {... и так далее, список на несколько экранов, плюс способности Ванги угадывать, какие вообще методы есть в данном классе ...} Но мне на такой код даже смотреть больно Итак, вопрос такой: есть ли более элегантный способ "заменить" нужный метод в рантайме? Какая-то магическая функция SetMethodAddress? Ne timeas obscurum. |