powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Статичные переменные в полях класса VBA
25 сообщений из 29, страница 1 из 2
Статичные переменные в полях класса VBA
    #39893001
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем, только что сделал маленькое открытие, что нельзя создавать статичные переменные в полях класса VBA.
Сама суть статичной переменной - иметь одно значение вне зависимости от количества инициализированных экземпляров класса.
И если её изменять в любом из экземпляров класса, она автоматом становится такой же во всех.
Если писать на Java, то создать можно одной строчкой (внизу код основного класса и проверки этого основного класса.):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
// Создаем класс TestStudents с статичным полем studentCourse, это курс
// на котором учится студент
public class TestStudents {
    public static int studentCourse ;
    public String name;
}
class RunTest {
    public static void main(String[] args) {
        // создаем студента Васю, который учится на третьем курсе
        // и присваиваем статичной переменной третий курс
        TestStudents student1 = new TestStudents();
        student1.studentCourse = 3;
        student1.name="Вася";
        // создаем студента Петю
        TestStudents student2 = new TestStudents();
        student2.name="Петя";
        //смотрим чему равен курс, на котором учится Петя
        System.out.println("Петя учится на курсе № "+ student2.studentCourse);
// Принт выводит ,что Петя учится на третьем курсе, как и Вася
        //теперь присваиваем Пете курс №4
        student2.studentCourse=4;
        //и смотрим какой курс стал у Васи
        System.out.println("Вася учится на курсе № "+ student1.studentCourse);

        // Принт выводит ,что Вася учится на четвертом курсе, как и Петя
    }
}



Как вы думаете, как повторить такой же челендж на ВБА?))
Без создания дополнительной глобальной переменной в модуле VBA и дополнительной процедуры в классе ,которая ссылается на эту переменную.
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893033
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов
Если писать на Java, то создать можно одной строчкой (внизу код основного класса и проверки этого основного класса.):

Сергей Лалов
Без создания дополнительной глобальной переменной в модуле VBA и дополнительной процедуры в классе ,которая ссылается на эту переменную.


На vba ни одной строчки - просто хранить такие переменные в таблице :) и доставать д-лукапом
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893040
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag
На vba ни одной строчки - просто хранить такие переменные в таблице :) и доставать д-лукапом
лучше хранить в TempVars
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893043
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов, я так понимаю все студенты заведения будут учиться на одном курсе?
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893045
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag

На vba ни одной строчки - просто хранить такие переменные в таблице :) и доставать д-лукапом


Не, это не получится статика) И даже если хранить в глобальных переменных , и потом в классах ссылаться на значения этой глобальной переменной, то это тоже не статика) Потому что в каждом экземпляре класса при таком подходе придется принудительно дополнительным методом приравнивать значение такой "статической" переменной. Это уже не статика)

А для настоящей статической переменной никаких дополнительных действий не нужно, она имеет одно значения на все экземпляры класса,вне зависимости от того ,сколько их инициализировал. И если её поменять хоть в одном экземпляре ,во всех остальных она станет такой же измененной (без всяких циклов и всего прочего). В этом вся её соль)
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893054
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург,
Это пример работы статики. Есть группа студентов ,которая учится на одном курсе. Считаем что что все нормально учатся и одновременно переходят с курса на курс.
Как мы бы с вами реализовали с возможностями VBA такой переход:
Есть группа студентов (объекты) с полями учебный курс.
1) Помещаем студентов в коллекцию (название коллекции к примеру учебный курс)
2) При переходе с курса на курс - проходим циклом каждого студента в коллекции и меняем у него курс с одного на другой .

Что дало бы необрезанное ООП в VBA. (с нормальными статическими членами в классе.)
1) Мы ничего нигде не гоняем и просто изменяем значение одной статической переменной данного класса. Класс.курс=4;
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893060
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов, ответ я тебе дал. Зачем сюда тащить приёмы других ЯП?
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893062
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург
Сергей Лалов, ответ я тебе дал. Зачем сюда тащить приёмы других ЯП?


Спасибо, сейчас помучаю посмотрю.
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893092
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург,

Посмотрел, это просто коллекция /хранилище глобальных переменных. В модуль класса это не впихнуть, а если дописывать процедуру обработки в обычном дополнительном модуле, то это уже не true. Как вы представляете класс ГруппаСтудентов , в котором переменная ссылается на tempvars (или простую глобальную переменную) и одновременно может и принимать и отдавать значение?)

Я плотно поштудировал эту тему , со статическими членами. Работают они только как переменные внутри процедуры/функции (к примеру Static x внутри функции/процедуры), либо как сами процедуры/функции (static function тратата). Задать их внутри класса как переменные к сожалению нельзя(
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893095
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А побрюзжать:
Сергей Лалов
...
2) При переходе с курса на курс - проходим циклом каждого студента в коллекции и меняем у него курс с одного на другой .
...

И грохаем всю историю. :)
Этот подход совершенно неприемлем в БД.

Приемлемое решение:
На основании приказа по учебному заведению персоны:
Иванов, Петров, Сидоров и т.д.
зачисляются на новый курс (новую группу)
в таком-то учебном году.
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893100
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов
Посмотрел, это просто коллекция /хранилище глобальных переменных. В модуль класса это не впихнуть
Чего не впихнуть? Пиши свойство и работай. Публичные переменные классов от свойств в VBA практически не отличаются.
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893103
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclared,

ну если в контексте именно организации учебного процесса рассматривать, то так то да)

У Панурга идея использовать дополнительный буфер (пусть это TempVars, ну или просто глобальная переменная).
Это механическое решение проблемы. У нас все равно есть лишняя спрятанная переменная внутри класса.

Вот кстати образец имитации статической переменной в классе VBA, накидал через проперти только что, в копилку, в сети есть примеры через дополнительную функцию, которая возвращает экземляр класса (маскируется под статику, ..или даже скорее под реализацию вашего ника VB_PredeclaredId = publicNotCreatable ))

Вот мое механическое решение через проперти:
1) Создаем обычную глобальную переменную в обычном модуле:

Код: vbnet
1.
Public staticField As Integer



2) Создаем класс Students с пропертями ,которые обращаются к этой глобальной переменной (которая является подсадной уткой- имитацией переменной типа static)

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private course As Integer
Public studentName As String

Public Property Let course(c As Integer)
staticField = c ' глобальная переменная равна вводимой переменной 
End Property

Public Property Get course()
course = staticField ' вытаскиваем из глобальной переменной значение, типа статик и все такое))
End Property
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893105
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург,

Уже написал, но это не тру)
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893112
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов, От нас то ты чего хочешь? Превратить VBA в java или c#?

Кстати, публичная переменная слетит при необработанной ошибке, TempVars - нет.
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893113
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправил...
Сергей Лалов
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Name As String

Public Property Let course(c As Integer)
staticField = c ' глобальная переменная равна вводимой переменной 
End Property

Public Property Get course() As Integer
course = staticField ' вытаскиваем из глобальной переменной значение, типа статик и все такое))
End Property

...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893121
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нонсенс в необходимости наличия такой переменной именно в описании класса - айтема коллекции.

Значение такой переменной не описывает свойство конкретного айтема коллекции,
оно описывает свойство самой коллекции (в вашем примере - курс).
И находится она, соответственно, должна в описании класса-коллекции.
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893124
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов

....Есть группа студентов (объекты) с полями учебный курс.
Стесняюсь спросить:а зачем такое поле? Достаточно в таблице студенты иметь поле датаПоступления
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893125
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург, да, спасибо, первая переменная была в общем то не нужна)


В общем с чего все началось)), описываю историю вкратце, решил я как то написать игрушку на VBA, в ООП стиле, написал работоспособный блок в экселе. Обычную леталку стрелялку, как на денди. Извернулся с картами текстур и объектов. (координаты ячейки и цвет ячейки записывается в коллекцию , а потом при нажатии на стрелки влево,вверх,вниз и право создается новая ячейка и перерисовывается.) Проблема заключается в том, что корабль состоит из множества ячеек которые хранятся в коллекции. И на нажатие стрелки к примеру влево необходимо перерисовывать каждую в коллекции. ) Так как VBA по умолчанию это один поток, то скорость отрисовки при увеличении количества объектов на листе (другие корабли, снаряды,оружие) скорость игры все будет сильней и сильней замедляться. И вот здесь бы как раз подошла концепция статической переменной в классе, где я менял бы ее к примеру одну, с 0 на -1 и все ячейки в коллекции автоматом без цикла шагали на column -1 .
При механической реализации статики все равно нужно дополнительное действие, чтобы переопределить значение каждой ячейки (потому что property это та же самая процедура,к которой нужно дополнительно обратится. В настоящей переменной типа Static она сразу меняется везде, без дополнительных подталкиваний.)

Вот работоспособный пример игры кстати , приложил в письме, с пятницей!)

Все летает, но пока без врагов и оружия. Просто первый блок. Корабль можно отрисовать любой, на соседнем листе ships. Что рисуете, то и летает)) Скорее всего придется переписывать и укрупнять корабль до объекта Range. И управлять им, потому что с обработкой коллекций при увеличении объектов на экране один поток/табличный процессор не справиться)
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893130
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогонку:после того как опубликовал свое глянул спойлер сообщения Predeclared в котором все правильно пояснено-назовите хоть одно учебное заведение где студент переводится с курса на курс не приказом по ВУЗу,а в результате вычислений произведенных компьютером
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893133
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclared
Нонсенс в необходимости наличия такой переменной именно в описании класса - айтема коллекции.

Значение такой переменной не описывает свойство конкретного айтема коллекции,
оно описывает свойство самой коллекции (в вашем примере - курс).
И находится она, соответственно, должна в описании класса-коллекции.


Это мы статику почти не используем в VBA и настороженно относимся, её красота в том, что не надо прикладывать дополнительных вычислений, процедур действий, чтобы изменить значение сразу у всех экземпляров полей класса)
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893134
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku,
тут вопрос больше в сравнении ООП нескольких ЯП. Что где можно, что нельзя, и если можно- то как)
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893142
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku
Стесняюсь спросить:а зачем такое поле?
Это термин такой. В ЯП ООП переменные уровня класса называются полями.
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893148
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, как сказал Панург , если мы рассматриваем ООП с позиции составляющих класса, то условно делим на три составляющих:
1) Поле класса (это ваши Public x,Private x, Friend x ) переменная которая находится внутри класса.
2) Метод класса (это обычные Function либо Sub ,которые вы впихиваете внутрь класса. Бывают Public,Private,Static,Friend)
3) Свойства класса (это Property, также бывают public,private итд.)

По сути третий можно было впихнуть во второй, но MS оформил отдельно.
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893149
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов
Сама суть статичной переменной - иметь одно значение вне зависимости от количества инициализированных экземпляров класса.
В VBA "статическая переменная" - это совсем иная вещица. Вообще-то... и, кстати, в модуле класса она объявлена быть не может.
...
Рейтинг: 0 / 0
Статичные переменные в полях класса VBA
    #39893150
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Лалов
если мы рассматриваем ООП с позиции составляющих класса, то условно делим на три составляющих:
1) Поле класса (это ваши Public x,Private x, Friend x ) переменная которая находится внутри класса.
Фигвам. В VBA нет "поля класса". Только поле экземпляра класса (переменной с типом Object/thisClass).
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Статичные переменные в полях класса VBA
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]