|
|
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
Попытался организовать сабж. Форма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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 10:36 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
глянь сюда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 10:39 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
поставь точки останова и посмотри в каком порядке идет выполнениее Код: plaintext 1. 2. 3. 4. 5. 6. и еще не очень хорошое имя ты выбрал для переменной ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 11:14 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
Попробуй Set f.value = Поле1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 11:46 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
Спасибо, спасибо. Имя "value" взято для примера; Меня интересовало, можно ли определить переменные класса формы до того, как форма загрузилась, обращаясь к переменным напрямую, а не через глобальные пернеменные. Видимо, нельзя, т.к. form_open происходит при set f = new form_Форма1, а до new экземпляр формы еще не существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 12:22 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
Что за бред?? Можно ли обращаться к св-вам объекта до его создания? Да конечно нет. Откуда такой вопрос вапсче возникнуть мог? После создания - пожалуйста. Если переменные (и внутренние, и доступные снаружи) надо чем-то инициализировать - для этого есть конструктор (для обычных классов) и событие Open (для форм и отчетов). Разумеется, ДО инициализации - они неинициализированы (простите за тафтологию) Разруха - она в головах (с) Собачье сердце ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 13:01 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
чтобы получить f.value _сразу_ при загрузке надо выполнять что-то типа me.value=Forms!форма2.Поле1 присваивать в Sub Form_Open Формы1, а не _после_ ее згрузки _из_ процедуры Формы2. Чтобы развязаться с "предками" (например форма1 может получать value не только из формы2) для передачи не зазорно использовать и глобальную переменную. Главное не обращаться к ней по другим надобностям. т.е. приблизительно так: Код: plaintext 1. Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. 6. 7. При этом, в отличие от простой глобальной переменной, вы получаете возможность иметь множество форм1 с собственным значением value (хотя бы из разных экземпляров Формы2, или вообще из разных форм). ЗЫ: если нет надобности отлавливать значения переданных параметров _до_ загрузки формы1, а только в процессе манипулирования в ней, то такая ступенчатость (передачи значения) не нужна. Величины (в вашем случае) получат значения, как только форма будет загружена и получит фокус. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 13:14 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
2Лох: >Можно ли обращаться к св-вам объекта до его создания? Да конечно нет. >Откуда такой вопрос вапсче возникнуть мог? >После создания - пожалуйста. А где я сказал, что хотел обратиться к св-вам формы до ее _СОЗДАНИЯ_ ? Читать надо внимательнее, если уж читать ;-) >Если переменные (и внутренние, и доступные снаружи) надо чем-то >инициализировать - для этого есть конструктор (для обычных классов) и Кстати, как реализуется конструктор в VBA ? >событие Open (для форм и отчетов). Во ! Я ж говорю - "можно ли определить переменные класса формы до того, как форма _ЗАГРУЗИЛАСЬ_", а не до того, как она создана. Я ошибочно полагал, что form_open инициируется form.visible = true. >Разруха - она в головах (с) Собачье сердце Сам дурак ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 14:19 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
А где я сказал, что хотел обратиться к св-вам формы до ее _СОЗДАНИЯ_ Пажалуйста. Цитирую тебя же: "Меня интересовало, можно ли определить переменные класса формы до того, как форма загрузилась , обращаясь к переменным напрямую" Если тебе так проще можешь считать, что "форма создана" = "форма загружена" как реализуется конструктор в VBA Class_Initialize - аналог (условный) конструктора Class_Terminate - аналог (условный) деструктора до того, как форма _ЗАГРУЗИЛАСЬ_", а не до того, как она создана Ну, до того как она создана - см. выше. До того, как она загрузилась - событие Open (не путать с Load). Сам дурак ;-) Я не дурак. Я - Лох ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 14:27 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
Поправочка (шоб не противоречить самому себе) До того, как она загрузилась - событие Open (не путать с Load). Имел ввиду, что до того как данные загрузились и начали отображаться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 14:39 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
>Пажалуйста. Цитирую тебя же: >"Меня интересовало, можно ли определить переменные класса формы до >того, как форма загрузилась, обращаясь к переменным напрямую" Я не говорил о _создании_, я гоаорил о _загрузке_ >Если тебе так проще можешь считать, что "форма создана" = "форма >загружена" А это действительно так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 14:51 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
Если тебе так проще можешь считать, что "форма создана" = "форма загружена" А это действительно так ? Насколько я понимаю событие Open - первое в списке вызываемых при открытии формы. До этого форма, конечно, существует. Где-то как-то. Но тебе это неинтересно, ибо к ней ты никак не достучишься. Так что абсолютно нормальным является считать, что форма начинает свое существование именно в момент срабатывания Form_Open. Обратный пример. Скажем, предположить, что форма существует после выполнения команды DoCmd.OpenForm - не есть правильно, ибо метод асинхронный, и при обращении к форме сразу за вызовом этого метода может вывалиться ашипка. Редко, но наталкивался и на такое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 14:59 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
>Насколько я понимаю событие Open - первое в списке вызываемых при >открытии формы В-общем, проблема в том, что в акцессе нет конструктора для класса формы. Поэтому приходится использовать либо глобальные переменные, либо обращаться к контролом вызванной формы напрямую. Это, кстати, по поводу ущербности ОО-подхода в акцессе... Думаю, тему можно закрывать, а то еще флейм начнется ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 16:28 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
Ну если умными словами начать кидаться - то в COM вообще, VB в частности, и аксесе в данном случае для объектов вапсче отсутсвует конструктор в понимании C++. Объект (COM-овский) инициализирует себя сам . Максимум что можно сделать - создать моникер, который создаст неинициализированный объект и запустит у него процедуру инициализации с нужными параметрами. Аналог в случае аксеса - открывать форму невидимой, вызывать у нее public-метод, куда и передавать все что нужно. В этом методе форма сама себя делает видимой. Если это часто используется - оформить как отдельлный класс/функцию З.Ы. А плане ООП ущербны все языки (окромя Smalltalk и платформы .Net ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 16:40 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
Да, так, пожалуй, будет наиболее кузяво. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2003, 17:05 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
Если позволите, пару слов по существу исходной проблемы открытия формы с передачей параметров. Если вызвать форму через 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(параметры текущей записи) и в вызываемой форме, которая болтается справа или вверху видишь полную раскладку всех полей. Красота! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2003, 06:11 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
а что имеется ввиду фразой "В-общем, проблема в том, что в акцессе нет конструктора для класса формы. " что такое конструктор класса ? в каких языках/средствах разработки есть ? что дает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2003, 09:06 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
OpenArgs во многих случаях достаточно, но недостатки свои имеет. Передаваемый параметр - только строка. Все параметры запихнуть в одну строку, а на открытии их парсить - то еще удовольствие. Да и не всегда возможно (объектные переменные, к примеру, так не передашь). Плюс отсутсвие контроля на этапе компиляции (т.е. это не плюс, а минус ). Относительно модальных форм. модальная форма не даст выполнить строку form_NewForm.Set_param(параметры) пока не закроется... ... или не будет скрыта (visible = false). Открывать ее сразу невидимой и вызывать нужный метод (инициализацию). Потом делать visible = true. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2003, 09:15 |
|
||
|
Экземпляр формы с параметром
|
|||
|---|---|---|---|
|
#18+
>что такое конструктор класса ? публичный метод, который вызывается при создании класса >в каких языках/средствах разработки есть ? по идее в любых, основанных на концепции объектно-ориентированного программирования, например, в C++, Java. Есть, как выяснилось, и в Access VBA, но только для классов-не форм. >что дает? прежде всего, удобство инициализации свойств объекта при создании экземпляра. >а что имеется ввиду фразой "В-общем, проблема в том, что в акцессе нет >конструктора для класса формы. " То, что нельзя напрямую инициализировать дополнительные (добавленные тобою) свойства формы при ее создании. Под доп. свойствами формы я подразумеваю переменные класса формы, объявленные вне процедур и функций. Выкрутиться, разумеется, всегда можно, но хорошо, когда есть стандартный способ, поддерживаемый самим языком (вот как раз конструктор). Мне понравился способ, предложенный здесь Лохом Позорным: >Аналог в случае аксеса - открывать форму невидимой, вызывать у нее public->метод, куда и передавать все что нужно. В этом методе форма сама себя >делает видимой. Если это часто используется - оформить как отдельлный >класс/функцию P.S. ООП рекомендую начинать изучать на примере Java :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2003, 12:26 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32215961&tid=1680342]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 360ms |

| 0 / 0 |
