Вот тут - http://18delphi.blogspot.ru/2013/11/gui.html я описывал как в скриптовой машине публиковать "ручки" для вызова методов на контролах приложения.
В частности там была описана "ручка" (слово скриптовой машины) - ButtonClick.
Это слово было сделано на основе "прямого вызова" к методу контрола.
Примерно вот так:
Но ни для кого не секрет, что какой-то из Delphi XEN - принёс нам с собой - "новый" RTTI.
Где очень удобно работать с информацией о методах объектов.
Попробуем применить эту технику для реализации "более низкоуровневого" слова ObjectMethodWithoutParametersCall.
Вызов метода объекта без параметров.
А уже через это "низкоуровневое слово" мы определим слово ButtonClick как "просто слово" пользовательского словаря.
Понятное дело, что всё это относится к Delphi XEN (не помню версии).
Итак. Опишем наше слово (сама работа с RTTI - "срисована" отсюда - http://delphi2010.ru/?p=218):
Повторюсь. Код использования "нового" RTTI - я "срисовывал". И не пробовал сам. Хотя документация выглядит - БОЛЕЕ чем привлекательно.
Но я хотел проиллюстрировать лишь идею.
Когда сам попробую - приведу конечный вариант.
Но "навскидку" - всё вроде бы правильно. И логично.
Итак.
Как же теперь выглядит наш метод ButtonClick с учётом наличия ObjectMethodWithoutParametersCall?
А вот так:
Опять же ремарка - обработку ошибок - я пока опустил.
Всё остальное - остаётся без изменений.
В частности например вот это:
В частности там была описана "ручка" (слово скриптовой машины) - ButtonClick.
Это слово было сделано на основе "прямого вызова" к методу контрола.
Примерно вот так:
procedure TkwButtonClick.DoIt(aContext : TscriptContext); var l_Component : TComponent; begin l_Component := aContext.PopObject As TComponent; Assert(l_Component Is TButton); (l_Component As TButton).Click; end;
Но ни для кого не секрет, что какой-то из Delphi XEN - принёс нам с собой - "новый" RTTI.
Где очень удобно работать с информацией о методах объектов.
Попробуем применить эту технику для реализации "более низкоуровневого" слова ObjectMethodWithoutParametersCall.
Вызов метода объекта без параметров.
А уже через это "низкоуровневое слово" мы определим слово ButtonClick как "просто слово" пользовательского словаря.
Понятное дело, что всё это относится к Delphi XEN (не помню версии).
Итак. Опишем наше слово (сама работа с RTTI - "срисована" отсюда - http://delphi2010.ru/?p=218):
interface TkwObjectMethodWithoutParametersCall = class(TscriptKeyWord) protected procedure DoIt(aContext: TscriptContext); override; end;//TkwObjectMethodWithoutParametersCall implementation procedure TkwObjectMethodWithoutParametersCall.DoIt(aContext: TscriptContext); var l_Object : TObject; l_MethodName : String; l_t : TRttiType; l_ctx : TRttiContext; l_ObjectMethod : TRttiMethod; begin l_Object := aContext.PopObject; l_MethodName := aContext.PopString; l_ctx := TRttiContext.Create; l_t := l_ctx.GetType(l_Object.ClassInfo); l_ObjectMethod := l_t.GetMethod(l_MethodName); if (l_ObjectMethod.GetParameters.Count = 0) then l_ObjectMethod.Invoke(l_Object, []) else Assert(false); l_ctx.Free; end; initialization ScriptEngine.RegisterKeyWord(TkwObjectMethodWithoutParametersCall, 'ObjectMethodWithoutParametersCall');
Повторюсь. Код использования "нового" RTTI - я "срисовывал". И не пробовал сам. Хотя документация выглядит - БОЛЕЕ чем привлекательно.
Но я хотел проиллюстрировать лишь идею.
Когда сам попробую - приведу конечный вариант.
Но "навскидку" - всё вроде бы правильно. И логично.
Итак.
Как же теперь выглядит наш метод ButtonClick с учётом наличия ObjectMethodWithoutParametersCall?
А вот так:
PROCEDURE ButtonClick OBJECT IN aControl 'Click' aControl ObjectMethodWithoutParametersCall END // ButtonClick
Опять же ремарка - обработку ошибок - я пока опустил.
Всё остальное - остаётся без изменений.
В частности например вот это:
PROCEDURE "Нажать кнопку" OBJECT IN aButton aButton ButtonClick END //"Нажать кнопку"
Комментариев нет:
Отправить комментарий