powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Экземпляр формы с параметром
19 сообщений из 19, страница 1 из 1
Экземпляр формы с параметром
    #32215219
Фотография dannis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попытался организовать сабж.

Форма1 (должна вызываться с разными значениями параметра) имеет публичную переменную класса: public value as integer

Форма2 имеет поле, значение которого должно передаваться в Форму1 в качестве параметра. Делаю:

dim f1 as Form_Форма1

Private Sub Кнопка0_Click()
Set f = New Form_Форма1
f.value = Поле1
f.Visible = True
End Sub

Пытаюсь отобразить переданный параметр (в Форме1):

Private Sub Form_Open(Cancel As Integer)
MsgBox (value)
End Sub

Отображается 0, хотя передается вовсе не 0

Как сделать ?

ps Подозреваю, что ответ пора давно включить в faq
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32215229
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
глянь сюда
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32215271
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поставь точки останова и посмотри в каком порядке идет выполнениее

Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub Кнопка0_Click() 
Set f = New Form_Форма1 
'здесь скорее всего выполняется событие открытие Private Sub Form_Open и отображается пустой MsgBox

f.value = Поле1 
f.Visible = True 
End Sub 

и еще не очень хорошое имя ты выбрал для переменной
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32215320
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй
Set f.value = Поле1
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32215405
Фотография dannis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, спасибо.

Имя "value" взято для примера;

Меня интересовало, можно ли определить переменные класса формы до того, как форма загрузилась, обращаясь к переменным напрямую, а не через глобальные пернеменные.
Видимо, нельзя, т.к. form_open происходит при set f = new form_Форма1, а до new экземпляр формы еще не существует.
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32215500
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за бред??

Можно ли обращаться к св-вам объекта до его создания? Да конечно нет. Откуда такой вопрос вапсче возникнуть мог?
После создания - пожалуйста.

Если переменные (и внутренние, и доступные снаружи) надо чем-то инициализировать - для этого есть конструктор (для обычных классов) и событие Open (для форм и отчетов).
Разумеется, ДО инициализации - они неинициализированы (простите за тафтологию)

Разруха - она в головах (с) Собачье сердце
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32215542
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чтобы получить f.value _сразу_ при загрузке надо выполнять что-то типа me.value=Forms!форма2.Поле1 присваивать в Sub Form_Open Формы1, а не _после_ ее згрузки _из_ процедуры Формы2. Чтобы развязаться с "предками" (например форма1 может получать value не только из формы2) для передачи не зазорно использовать и глобальную переменную. Главное не обращаться к ней по другим надобностям.
т.е. приблизительно так:
Код: plaintext
1.
Global Форма1_value

Код: plaintext
1.
2.
3.
4.
5.
Public value

Private Sub Form_Open(Cancel As Integer)
    Me.value = Форма1_value
    MsgBox (value)
End Sub

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Dim f As Form_Форма1

Private Sub Кнопка0_Click()
Форма1_value = Поле1
Set f = New Form_Форма1
'f.value = Поле1
f.Visible = True
End Sub


При этом, в отличие от простой глобальной переменной, вы получаете возможность иметь множество форм1 с собственным значением value (хотя бы из разных экземпляров Формы2, или вообще из разных форм).
ЗЫ: если нет надобности отлавливать значения переданных параметров _до_ загрузки формы1, а только в процессе манипулирования в ней, то такая ступенчатость (передачи значения) не нужна. Величины (в вашем случае) получат значения, как только форма будет загружена и получит фокус.
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32215683
Фотография dannis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Лох:

>Можно ли обращаться к св-вам объекта до его создания? Да конечно нет. >Откуда такой вопрос вапсче возникнуть мог?
>После создания - пожалуйста.

А где я сказал, что хотел обратиться к св-вам формы до ее _СОЗДАНИЯ_ ?
Читать надо внимательнее, если уж читать ;-)

>Если переменные (и внутренние, и доступные снаружи) надо чем-то >инициализировать - для этого есть конструктор (для обычных классов) и

Кстати, как реализуется конструктор в VBA ?

>событие Open (для форм и отчетов).

Во ! Я ж говорю - "можно ли определить переменные класса формы до того, как форма _ЗАГРУЗИЛАСЬ_", а не до того, как она создана.

Я ошибочно полагал, что form_open инициируется form.visible = true.

>Разруха - она в головах (с) Собачье сердце

Сам дурак ;-)
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32215702
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где я сказал, что хотел обратиться к св-вам формы до ее _СОЗДАНИЯ_
Пажалуйста. Цитирую тебя же:
"Меня интересовало, можно ли определить переменные класса формы до того, как форма загрузилась , обращаясь к переменным напрямую"
Если тебе так проще можешь считать, что "форма создана" = "форма загружена"

как реализуется конструктор в VBA
Class_Initialize - аналог (условный) конструктора
Class_Terminate - аналог (условный) деструктора

до того, как форма _ЗАГРУЗИЛАСЬ_", а не до того, как она создана
Ну, до того как она создана - см. выше.
До того, как она загрузилась - событие Open (не путать с Load).

Сам дурак ;-)
Я не дурак. Я - Лох
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32215733
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправочка (шоб не противоречить самому себе)
До того, как она загрузилась - событие Open (не путать с Load).
Имел ввиду, что до того как данные загрузились и начали отображаться
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32215765
Фотография dannis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Пажалуйста. Цитирую тебя же:
>"Меня интересовало, можно ли определить переменные класса формы до >того, как форма загрузилась, обращаясь к переменным напрямую"

Я не говорил о _создании_, я гоаорил о _загрузке_

>Если тебе так проще можешь считать, что "форма создана" = "форма >загружена"

А это действительно так ?
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32215787
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если тебе так проще можешь считать, что "форма создана" = "форма загружена"
А это действительно так ?

Насколько я понимаю событие Open - первое в списке вызываемых при открытии формы. До этого форма, конечно, существует. Где-то как-то. Но тебе это неинтересно, ибо к ней ты никак не достучишься.
Так что абсолютно нормальным является считать, что форма начинает свое существование именно в момент срабатывания Form_Open.
Обратный пример. Скажем, предположить, что форма существует после выполнения команды DoCmd.OpenForm - не есть правильно, ибо метод асинхронный, и при обращении к форме сразу за вызовом этого метода может вывалиться ашипка. Редко, но наталкивался и на такое.
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32215961
Фотография dannis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Насколько я понимаю событие Open - первое в списке вызываемых при >открытии формы

В-общем, проблема в том, что в акцессе нет конструктора для класса формы.
Поэтому приходится использовать либо глобальные переменные, либо обращаться к контролом вызванной формы напрямую.
Это, кстати, по поводу ущербности ОО-подхода в акцессе...

Думаю, тему можно закрывать, а то еще флейм начнется ;-)
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32215978
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если умными словами начать кидаться - то в COM вообще, VB в частности, и аксесе в данном случае для объектов вапсче отсутсвует конструктор в понимании C++.
Объект (COM-овский) инициализирует себя сам . Максимум что можно сделать - создать моникер, который создаст неинициализированный объект и запустит у него процедуру инициализации с нужными параметрами.
Аналог в случае аксеса - открывать форму невидимой, вызывать у нее public-метод, куда и передавать все что нужно. В этом методе форма сама себя делает видимой. Если это часто используется - оформить как отдельлный класс/функцию

З.Ы. А плане ООП ущербны все языки (окромя Smalltalk и платформы .Net
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32216043
Фотография dannis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, так, пожалуй, будет наиболее кузяво.
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32216383
nauvad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если позволите, пару слов по существу исходной проблемы открытия формы с передачей параметров.
Если вызвать форму через docmd.openform , то можно в нее передать строку в которой сбросить параметры, а в отркывшейся форме по событию Lоad или Open взять эту строку в параметре OpenArgs типа Variant, дешифровать его и загрузить в контролы открывшейся формы.
Этот прием особенно хорош при обращении к модально открываемым формам, но не подходит к отчетам, для которых OpenArgs не предусмотрен

Есть другой, более красивый способ - сделать в вызываемой форме Public процедуру типа Set_param(параметры) в которую по ссылке можно передавать непосредственно объекты и присваивать их параметры аналогичным объектам открывшейся формы. Вызов этой процедуры делается сразу после
docmd.openform NewForm
командой запуска глобальной процедуры в модуле УЖЕ ОТКРЫВШЕЙСЯ формы
form_NewForm.Set_param(параметры)
Можно применять в формах (не модальных, так как модальная форма не даст выполнить строку form_NewForm.Set_param(параметры) пока не закроется) и отчетах.
Особенно удобно использовать этот способ для сканирования записей в вызывающей табличной форме без закрытия вызываемой. В событии Form_Current помещаешь form_NewForm.Set_param(параметры текущей записи) и в вызываемой форме, которая болтается справа или вверху видишь полную раскладку всех полей. Красота!
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32216442
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что имеется ввиду фразой "В-общем, проблема в том, что в акцессе нет конструктора для класса формы. "

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

Относительно модальных форм.
модальная форма не даст выполнить строку form_NewForm.Set_param(параметры) пока не закроется...
... или не будет скрыта (visible = false).
Открывать ее сразу невидимой и вызывать нужный метод (инициализацию). Потом делать visible = true.
...
Рейтинг: 0 / 0
Экземпляр формы с параметром
    #32216733
Фотография dannis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>что такое конструктор класса ?

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

>в каких языках/средствах разработки есть ?

по идее в любых, основанных на концепции объектно-ориентированного программирования, например, в C++, Java. Есть, как выяснилось, и в
Access VBA, но только для классов-не форм.

>что дает?

прежде всего, удобство инициализации свойств объекта при создании экземпляра.

>а что имеется ввиду фразой "В-общем, проблема в том, что в акцессе нет >конструктора для класса формы. "

То, что нельзя напрямую инициализировать дополнительные (добавленные тобою) свойства формы при ее создании. Под доп. свойствами формы
я подразумеваю переменные класса формы, объявленные вне процедур и функций.
Выкрутиться, разумеется, всегда можно, но хорошо, когда есть стандартный
способ, поддерживаемый самим языком (вот как раз конструктор).
Мне понравился способ, предложенный здесь Лохом Позорным:

>Аналог в случае аксеса - открывать форму невидимой, вызывать у нее public->метод, куда и передавать все что нужно. В этом методе форма сама себя >делает видимой. Если это часто используется - оформить как отдельлный >класс/функцию

P.S. ООП рекомендую начинать изучать на примере Java :-)
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Экземпляр формы с параметром
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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