к оглавлению VB   VBScript   VBA   VB7 (.NET)   к 4GL - визуальному программированию

Совместное использование значений процедурами

    Иногда требуется разделять значения переменных между процедурами обработки событий. Например, если приложение выполняет вычисления, всегда используя одинаковую процентную ставку, ее значение должно быть доступно всем процедурам формы. Такие переменные называют переменными уровня формы или уровня модуля (form-level, module-level). На рис. 5-4 показаны области видимости для переменных в проекте Visual Basic с одной формой. Как и оператор Option Explicit, объявление переменных уровня формы происходит в разделе Declarations. Например, если открыто окно Code, можно выбрать (Declarations) для объекта (General) и ввести:

Dim InterestRate As Currency

    Очевидно, что последний пункт призывает к осторожному изменению значений переменных уровня формы. Любая информация, передаваемая между процедурами обработки событий, является благодатной почвой для программных ошибок. Более того, зачастую такие ошибки тяжело исправлять.
    В принципе, для локальных переменных и переменных уровня формы можно использовать одинаковые имена, хотя это не совсем хорошая идея. Любой оператор Dim на уровне процедуры имеет преимущество перед аналогичным на уровне формы, поэтому такие переменные будут локальными. Но при этом теряется возможность использования информации, содержащейся в переменных уровня формы. То есть дублирование имен приводит к недоступности для процедуры значения переменной уровня формы. Visual Basic, в свою очередь, не сообщает об этом программисту. Вот еще одна причина, по которой рекомендуется явно объявлять локальные переменные при помощи оператора Dim.


Совет: Некоторые программисты любят использовать префикс f (например, flnterest) для переменных уровня формы, а букву g - при обозначении глобальных переменных (например, ginterest). Это позволяет распознавать область видимости для конкретной переменной буквально с одного взгляда.

Зарезервированное слово Private. Visual Basic 5 использует это новое слово Private для обозначения переменных уровня формы. Private работает аналогично оператору Dim, и его можно использовать вместо этого оператора в разделе (General) для формы. Смысл состоит в том, чтобы отделить переменные уровня формы от так называемых глобальных (или public) переменных.

Сохраняем значения

    Когда Visual Basic вызывает процедуру обработки события, старые значения локальных переменных уничтожаются. Они принимают значения по умолчанию. (Как часто отмечалось, лучше их проинициализировать заново.) Такие переменные называются динамическими. Однако этого недостаточно в некоторых ситуациях. Например, необходимо отследить, сколько раз была нажата командная кнопка. Если счетчик будет все время сбрасываться, сосчитать будет невозможно. В принципе, можно использовать для таких целей переменные уровня формы, но лучше применять их только для обмена информацией. Большинство программистов используют такой подход, только если необходимо считать и другим процедурам.
    Выходом является использование статических переменных. Такие переменные не инициализируются повторно при вызове процедуры. Кроме того, что они идеально подходят для счетчиков, их используют, чтобы сделать элементы управления видимыми либо невидимыми (вообще говоря, для любых операций с булевыми свойствами), а также в отладочных целях. Для того чтобы объявить внутри процедуры статическую переменную, необходимо оператор Dim заменить на зарезервированное слово Static:

Static Counter As Integer, IsVisibie As Boolean

Ниже приведен пример процедуры обработки события с командной кнопкой, которая подсчитывает число щелчков и выводит суммарное значение:

Private Sub Commandl_Click ( )
'Данная процедура использует статическую переменную для подсчета щелчков
Static Counter As Integer    'Счетчик начинается с нуля
Counter = Counter + 1
Print Counter End Sub

    При первом щелчке счетчику присваивается значение по умолчанию, то есть 0. Затем Visual Basic добавляет к нему 1 и затем выводит результат.
    Иногда требуется, чтобы все переменные в процедуре были статическими. Для этого необходимо добавить зарезервированное слово Static перед строкой Private Sub, с которой начинается любая процедура:

Static Private Sub Commandl Click ()


Примечание: Переменные уровня формы и уровня модуля всегда сохраняют свои значения. Проблема состоит в том, что их может изменить любая процедура, а это может приводить к ошибкам. И когда необходимо сохранять значения переменных в перерывах между использованием процедуры, лучше применять статические переменные, чем переменные уровня формы или модуля.


 
 
 
 
Рисунок 5-4. Области видимости переменных.

 

к оглавлению VB   VBScript   VBA   VB7 (.NET)   к 4GL - визуальному программированию

Знаете ли Вы, что cогласно релятивистской мифологии "гравитационное линзирование - это физическое явление, связанное с отклонением лучей света в поле тяжести. Гравитационные линзы обясняют образование кратных изображений одного и того же астрономического объекта (квазаров, галактик), когда на луч зрения от источника к наблюдателю попадает другая галактика или скопление галактик (собственно линза). В некоторых изображениях происходит усиление яркости оригинального источника." (Релятивисты приводят примеры искажения изображений галактик в качестве подтверждения ОТО - воздействия гравитации на свет)
При этом они забывают, что поле действия эффекта ОТО - это малые углы вблизи поверхности звезд, где на самом деле этот эффект не наблюдается (затменные двойные). Разница в шкалах явлений реального искажения изображений галактик и мифического отклонения вблизи звезд - 1011 раз. Приведу аналогию. Можно говорить о воздействии поверхностного натяжения на форму капель, но нельзя серьезно говорить о силе поверхностного натяжения, как о причине океанских приливов.
Эфирная физика находит ответ на наблюдаемое явление искажения изображений галактик. Это результат нагрева эфира вблизи галактик, изменения его плотности и, следовательно, изменения скорости света на галактических расстояниях вследствие преломления света в эфире различной плотности. Подтверждением термической природы искажения изображений галактик является прямая связь этого искажения с радиоизлучением пространства, то есть эфира в этом месте, смещение спектра CMB (космическое микроволновое излучение) в данном направлении в высокочастотную область. Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution