Показать сообщение отдельно
  #1  
Старый 01.02.2020, 02:47
Аватар для Lothlorien
Lothlorien Lothlorien вне форума
Новичок
 
Регистрация: 06.04.2011
Адрес: Солнечная система
Сообщения: 69
Версия Delphi: 7.0
Репутация: 12
Вопрос Переназначение методов в 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.
Ответить с цитированием