Вот тут - http://18delphi.blogspot.ru/2013/11/gui_4.html я описывал как можно изменить свойство объекта приложения при помощи "специально выделенной ручки".
Там было описано слово EditSetText.
Теперь мы попробуем использовать RTTI для примерно тех же целей.
Напишем более "низкоуровневые" слова на Delphi.
А слово EditSetText - определим уже в "пользовательском словаре".
Итак:
Вот что мы имеем "со стороны Delphi":
Обработку ошибок - пока намерено опускаю.
Понятное, дело, что точно так же можно определить и ObjectGetIntegerProp, ObjectSetIntegerProp и ObjectGetBooleanProp, ObjectSetBooleanProp ти т.д. и т.п.
Теперь как "преображается" наше слово EditSetText:
В "пару" ему можно написать слово получения текста:
Весь остальной код предыдущего примера - остаётся без изменений.
Т.е. например слово "Присвоить текст в текущий контрол" - остаётся без изменений:
Обработку ошибок тут - я опять же, пока - намеренно - опустил.
Там было описано слово EditSetText.
Теперь мы попробуем использовать RTTI для примерно тех же целей.
Напишем более "низкоуровневые" слова на Delphi.
А слово EditSetText - определим уже в "пользовательском словаре".
Итак:
Вот что мы имеем "со стороны Delphi":
interface TkwObjectGetStringProp = class(TscriptKeyWord) protected procedure DoIt(aContext: TscriptContext); override; end;//TkwObjectGetStrProp TkwObjectSetStringProp = class(TscriptKeyWord) protected procedure DoIt(aContext: TscriptContext); override; end;//TkwObjectGetStrProp implementation procedure TkwObjectGetStringProp.DoIt(aContext: TscriptContext); var l_Object : TObject; l_PropertyName : String; begin l_Object := aContext.PopObject; l_PropertyName := aContext.PopString; aContext.PushString(GetStrProp(l_Object, l_PropertyName)); end; procedure TkwObjectSetStringProp.DoIt(aContext: TscriptContext); var l_Object : TObject; l_PropertyName : String; l_PropertyValue : String; begin l_Object := aContext.PopObject; l_PropertyName := aContext.PopString; l_PropertyValue := aContext.PopString; SetStrProp(l_Object, l_PropertyName, l_V); SetStrProp(l_Object, l_PropertyName, l_PropertyValue); end; initialization ScriptEngine.RegisterKeyWord(TkwObjectGetStringProp, 'ObjectGetStringProp'); ScriptEngine.RegisterKeyWord(TkwObjectSetStringProp, 'ObjectSetStringProp');
Обработку ошибок - пока намерено опускаю.
Понятное, дело, что точно так же можно определить и ObjectGetIntegerProp, ObjectSetIntegerProp и ObjectGetBooleanProp, ObjectSetBooleanProp ти т.д. и т.п.
Теперь как "преображается" наше слово EditSetText:
PROCEDURE EditSetText STRING IN aText OBJECT IN aControl aText 'Text' aControl ObjectSetStringProp END // EditSetText
В "пару" ему можно написать слово получения текста:
FUNCTION EditGetText OBJECT IN aControl 'Text' aControl ObjectGetStringProp END // EditSetText
Весь остальной код предыдущего примера - остаётся без изменений.
Т.е. например слово "Присвоить текст в текущий контрол" - остаётся без изменений:
PROCEDURE "Присвоить текст в текущий контрол" STRING IN aText OBJECT VAR l_Control FocusedControl =: l_Control aText l_Control EditSetText END //"Присвоить текст в текущий контрол"
Обработку ошибок тут - я опять же, пока - намеренно - опустил.
Комментариев нет:
Отправить комментарий