Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Статичные переменные в полях класса VBA / 25 сообщений из 29, страница 1 из 2
22.11.2019, 15:24
    #39893001
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статичные переменные в полях класса VBA
Привет всем, только что сделал маленькое открытие, что нельзя создавать статичные переменные в полях класса 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
22.11.2019, 16:13
    #39893033
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статичные переменные в полях класса VBA
Сергей Лалов
Если писать на Java, то создать можно одной строчкой (внизу код основного класса и проверки этого основного класса.):

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


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

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


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

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

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


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

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

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

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

Приемлемое решение:
На основании приказа по учебному заведению персоны:
Иванов, Петров, Сидоров и т.д.
зачисляются на новый курс (новую группу)
в таком-то учебном году.
...
Рейтинг: 0 / 0
22.11.2019, 17:55
    #39893100
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статичные переменные в полях класса VBA
Сергей Лалов
Посмотрел, это просто коллекция /хранилище глобальных переменных. В модуль класса это не впихнуть
Чего не впихнуть? Пиши свойство и работай. Публичные переменные классов от свойств в VBA практически не отличаются.
...
Рейтинг: 0 / 0
22.11.2019, 18:03
    #39893103
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статичные переменные в полях класса VBA
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
22.11.2019, 18:12
    #39893105
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статичные переменные в полях класса VBA
Панург,

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

Кстати, публичная переменная слетит при необработанной ошибке, TempVars - нет.
...
Рейтинг: 0 / 0
22.11.2019, 18:22
    #39893113
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статичные переменные в полях класса VBA
Поправил...
Сергей Лалов
Код: 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
22.11.2019, 18:48
    #39893121
Predeclared
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статичные переменные в полях класса VBA
Нонсенс в необходимости наличия такой переменной именно в описании класса - айтема коллекции.

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

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


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

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

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

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


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

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


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