Static
Static[.<type>] <variable[.<type>]> [= <constant expression>] [, ...]
Описание
Ключевое слово Static позволяет создавать локальную долгоживущую (статичную) переменную в Процедуре, даже если та же переменная была объявлена как Глобальная в основной программе. Если после ключевого слова Static указывается тип, то для этого объявления тип используемый по умолчанию изменяется на указанный. Static может также использоваться с Массивами, Связными списками и Хеш-картами. При объявлении статичного массива, параметр размерности должен быть постоянным значением.
Значение статичной переменной не обнуляется при каждом вызове процедуры, следовательно, можно использовать локальные переменные, параллельно с глобальными переменными (с тем же самым именем), и обе сохранят свои значения. Каждой переменной может быть присвоено значение по умолчанию, непосредственно назначенное ей, но оно должно быть постоянным значением, то есть число или константа а не значение другой переменной.
Помимо Static вы можете использовать ключевое слово Protected, чтобы отделить глобальные переменные от локальных, но с помощью Protected локальные переменные не будут сохранять свои значения.
Более подробно про переменные, объявления, типы данных и области видимости можно почитать здесь.
Пример: С переменной
Global a a = 10 Procedure Change() Static a a+1 Debug "In Procedure: "+Str(a) ; Распечатает 1, 2, 3, поскольку переменная постепенно увеличивается при каждом вызове процедуры. EndProcedure Change() Change() Change() Debug a ; Распечатает 10, поскольку статическая переменная не влияет на глобальный.
Пример: С массивом
Global Dim Array(2) Array(0) = 10 Procedure Change() Static Dim Array(2) Array(0)+1 Debug "In Procedure: "+Str(Array(0)) ; Распечатает 1, 2, 3 как значение полевых инкрементов массива при каждом вызове процедуры. EndProcedure Change() Change() Change() Debug Array(0) ; Распечатает 10, поскольку статический массив не влияет на глобальный.
Пример: С несколькими процедурами
Procedure Foo() Static x = 100 ; объявление и присвоение выполняется только один раз при запуске программы. Debug x x + 1 EndProcedure Foo() ; Отобразит 100 Foo() ; Отобразит 101 Foo() ; Отобразит 102 Debug "---" Procedure Bar() Static x ; объявление делается только один раз при запуске программы. x = 100 ; присваивание выполняется при каждом вызове процедуры. Debug x x + 1 EndProcedure Bar() ; Отобразит 100 Bar() ; Отобразит 100 Bar() ; Отобразит 100