Runtime (Время выполнения)
Runtime Variable Runtime #Constant Runtime Procedure() declaration Runtime Enumeration declaration
Описание
Для опытных программистов. Ключевое слово Runtime используется для создания списка программных объектов, таких как Переменные, Константы и Процедуры, к которым можно будет обратиться по их имени (в строковом виде), во время работы программы. Дело в том, что после компиляции программы, в исполняемом файле об именах переменных (констант, процедур и тд) не остается никаких сведений, и имена в строковом виде - бесполезны. Ключевое слово Runtime принуждает компилятор добавить дополнительную ссылку на указанный объект, который затем будет доступен через команды библиотеки Runtime. Такими объектами можно управлять, используя их имя в строковом виде, даже когда программа скомпилирована.
Чтобы увидеть, как можно использовать Runtime, просмотрите библиотеку Dialog, которая использует Runtime для доступа к процедурам событий, связанным с Гаджетами. Здесь имя процедуры, которая будет использоваться обработчиком события, указывается в файле XML (который является текстовым файлом), а затем библиотека Dialog использует функцию GetRuntimeInteger(), чтобы найти адрес процедуры во время выполнения программы. Нет необходимости перекомпилировать программу для ее изменения.
Другим вариантом было бы добавить к программе небольшой язык сценариев реального времени, что упростит изменение открытых переменных, используя значения констант во время этапа выполнения. Хотя это можно сделать вручную, построив карту объектов, ключевое слово Runtime может сделать это стандартным и унифицированным способом.
Пример: процедура
Runtime Procedure OnEvent() Debug "OnEvent" EndProcedure Debug GetRuntimeInteger("OnEvent()") ; Покажет адрес процедуры
Пример: Перечисления (Enumeration)
Runtime Enumeration #Constant1 = 10 #Constant2 #Constant3 EndEnumeration Debug GetRuntimeInteger("#Constant1") Debug GetRuntimeInteger("#Constant2") Debug GetRuntimeInteger("#Constant3")
Пример: переменная
Define a = 20 Runtime a Debug GetRuntimeInteger("a") SetRuntimeInteger("a", 30) Debug a ; переменная была изменена
Пример: Вызов функции по ее имени
Prototype Function() Runtime Procedure Function1() Debug "Я вызываю Function1 по имени" EndProcedure Runtime Procedure Function2() Debug "Я вызываю Function2 по имени" EndProcedure Procedure LaunchProcedure(Name.s) Protected ProcedureName.Function = GetRuntimeInteger(Name + "()") ProcedureName() EndProcedure LaunchProcedure("Function1") ; Отобразит "Я вызываю Function1 по имени" LaunchProcedure("Function2") ; Отобразит "Я вызываю Function2 по имени"
Пример: можно использовать значение цикла для формирования имени объекта.
Define.i var0=10, var1=11, var2=12, var3=13, var4=14, var5=15 Runtime var0, var1, var2, var3, var4, var5 For i=0 To 5 Debug GetRuntimeInteger("var"+ i) Next
Пример: с помощью Runtime можно получить доступ к приватным переменным модуля.
DeclareModule x Declare Get() EndDeclareModule Module x Global z=0 Runtime z Procedure Get() ProcedureReturn z EndProcedure EndModule Debug x::Get() SetRuntimeInteger("x::z", 100) Debug x::Get()