Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как обращаться к процедурам форм? (A2000)
 
 автор: Loser   (15.06.2008 в 19:51)   личное сообщение
 
 

есть отдельный модуль с функциями и переменными - к нему спокойно можно обратиться откуда угодно и почти :( как угодно, лишь бы то, к чему обращаются было Public.

вопрос: как обращаться к функциям, находящимся в модулях самих форм? в некоторой форме есть функция SelfRefresh, которая сама знает что ей делать, но я совершенно не хочу прописывать эту гадость во ВСЕХ других формах, которые могут захотеть обновить эту форму.

т.е. должно быть в самой форме:
Public Sub SelfRefresh()
(все нужные действия)
End Sub

а везде, где это понадобится, - что-то типа Call ????.SelfRefresh.

БЕЗ вникания, как внутри устроена этв дурацкая форма, каких чайлдов в ней надо обновлять, а каких нет и т.д.

Но как?? :(

  Ответить  
 
 автор: Силыч   (15.06.2008 в 21:02)   личное сообщение
 
 

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

  Ответить  
 
 автор: palarm   (16.06.2008 в 04:19)   личное сообщение
 
 

если фома не открыта, то никак

Почему же никак....
Нужно просто писать полное имя модуля, процедура или функция к которй обращаются должна быть Public.
Form_frmMyForm.SelfRefresh

  Ответить  
 
 автор: osmor   (16.06.2008 в 08:41)   личное сообщение
 
 

В этом случае все равно создается экземпляр формы и выполняются все события происходящие при обычном (DoCmd) открытии формы типа onLoad и т.п.
т.е. фактически форма открывается

  Ответить  
 
 автор: Bellerofont   (16.06.2008 в 08:59)   личное сообщение
 
 

Лучше забыть об этом, чтобы не было проблем, напрмер,
http://www.sql.ru/forum/actualthread.aspx?bid=4&tid=560341&pg=-1

  Ответить  
 
 автор: Bellerofont   (16.06.2008 в 09:00)   личное сообщение
 
 

Да и Public она при таком вызове не обязательно должна быть ...

  Ответить  
 
 автор: palarm   (16.06.2008 в 12:44)   личное сообщение
 
 

Точно, признаю свою глупость. Такие вызовы чреваты

  Ответить  
 
 автор: Loser   (16.06.2008 в 16:15)   личное сообщение
 
 

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

Осмор:
поясни, что ты имеешь в виду? я тебя понял так, что когда я пишу свое обращение, то команда отправляется не в уже открытую форму, а ради это она открывается ЕЩЕ РАЗ??
или я второй день ничего не соображаю?

Беллерофонт:
прочитал, но не все понял. Они там обсуждают обращение к эвенту, который и сам по себе работает, а мне надо гораздо меньше чем им.

All:
то ли руки у меня вчера кривые были, то ли еще что-то, но сегодня строчка

Parent!Child1.Form.SelfRefresh

- прекрасно работает (в том модуле - просто Public Sub). То ли я ее вчера криво писал, то ли не ее писал, то ли я перед ней обязательно Call хотел вставить, не понял :(
Но, с учетом всего этого и того (по ссылке) обсуждения, остался вопрос:

а таки чем же такие вызовы чреваты?

  Ответить  
 
 автор: osmor   (16.06.2008 в 16:35)   личное сообщение
 
 

вызов типа Form_frmMyForm.SelfRefresh
чреват тем, что если форма не открыта в данный момент, то создастся ее экземпляр, в котором отработают все события которые должны произойти при открытии формы, а это не всегда желательно

  Ответить  
 
 автор: Loser   (17.06.2008 в 03:58)   личное сообщение
 
 

Osmor:
правильно ли я понимаю:
1. если форма уже открыта - этот вызов найдет именно ее, и такой вызов не будет чреват ничем, причем нет разницы, является ли эта форма чьим-то чайлдом или нет - Акцесс найдет именно ее?

2. если форма не открыта, но если я вызову её процедуру, адресуясь к форме "полностью" типа Forms!Main!Child99.Form.SelfRefresh, то форма эта будет открыта, причем она откроется именно как чайлд моей главной формы, и мне, собственно, будет абсолютно наплевать, что это было на самом деле коряво?

3. если форма не открыта, но её процедуру я вызову, адресуясь не с "полным путем" (как в п.2), а, например, где-то заранее, например, на FormOpen, запомнив на нее ссылку типа Set НужнаяФорма = ...... (как-нибудь по-кривому написанная ссылка), то когда я ее вызову - она создастся сама по себе, а когда главная форма таки дотормозит до конца, и создаст своего чайлда99, то это будет дубликат, и все, что там наработала вызванная процедура раньше, к новосозданному чайлду не будет иметь никакого отношения?

все ли так?

если да, то как, собственно, должна выглядеть кривонаписанная ссылка из п.3, чтобы было невозможное нормальное течение дел, как я описал в п.2? потому что как я себе это представляю, то если Set написан по уму, т.е. Me!Child и т.д. - то и откроется она как чайлд, а если нет - то я сам виноват, что фигню написал.

  Ответить  
 
 автор: osmor   (17.06.2008 в 09:11)   личное сообщение
 
 

"1. если форма уже открыта - этот вызов найдет именно ее, и такой вызов не будет чреват ничем, причем нет разницы, является ли эта форма чьим-то чайлдом или нет - Акцесс найдет именно ее?"

да

2. если форма не открыта, но если я вызову её процедуру, адресуясь к форме "полностью" типа Forms!Main!Child99.Form.SelfRefresh, то форма эта будет открыта, причем она откроется именно как чайлд моей главной формы, и мне, собственно, будет абсолютно наплевать, что это было на самом деле коряво?

нет. Вы не сможете так обратиться к НЕ открытой форме, т.к. в коллекцию Forms попадают только открытые формы

3. если форма не открыта, но её процедуру я вызову, адресуясь не с "полным путем" (как в п.2), а, например, где-то заранее, например, на FormOpen, запомнив на нее ссылку типа Set НужнаяФорма = ...... (как-нибудь по-кривому написанная ссылка), то когда я ее вызову - она создастся сама по себе, а когда главная форма таки дотормозит до конца, и создаст своего чайлда99, то это будет дубликат, и все, что там наработала вызванная процедура раньше, к новосозданному чайлду не будет иметь никакого отношения?

что-то не понял. Вы можете создать глобальную переменную, и при загрузке формы присвоить этой переменой значение формы
типа.
set frm = me
или
set frm = me.[подформа].form

В этом случае после закрытия формы можно вызывать функции это формы
call frm.MyFunction

если вы хотите обновить все подформы, то почему не вызвать вот так?
Parent!Child1.Form.SelfRefresh

  Ответить  
 
 автор: Bellerofont   (17.06.2008 в 10:06)   личное сообщение
 
 


"1. если форма уже открыта - этот вызов найдет именно ее, и такой вызов не будет чреват ничем, причем нет разницы, является ли эта форма чьим-то чайлдом или нет - Акцесс найдет именно ее?"

да


Но следует учитывать, что фожет быть открыто несколько экземпляров формы (например, открыто несколько форм, в которой нужная форма используется в качестве подчиненной),
а код будет выполнен лишь в одной форме.
(речь о Form_ИмяФормы)

  Ответить  
 
 автор: Loser   (17.06.2008 в 18:22)   личное сообщение
 
 

Osmor:
1.
>да
я реально счастлив.

2.
вы писали ранее:
>В этом случае все равно создается экземпляр формы ....
>т.е. фактически форма открывается
и теперь:
>нет. Вы не сможете так обратиться к НЕ открытой форме, т.к.
>в коллекцию Forms попадают только открытые формы

я не в состоянии это понять. разве эти две вещи не взаимоисключают друг друга???
вторую то вещь я как раз понимаю, с этим я сталкиваюсь каждый раз, когда у меня чайлды передают приказы друг другу, и мне эпизодически приходится писать в коде On Error Resume Next, чтобы при первом проходе, когда некоторые чайдлы еще не открыты - не выскакивали сообщения об ошибке, это я знаю. но что вы имели в виду ранее под "форма открывается"?

3. это не вы, это я все никак не могу понять, как выглядит та ситуация, когда запрошенные мной действия (процедуры) происходят не в той форме, которая мне нужна, а в какой-то левой, которая у нас "чреватая"

4.
> В этом случае после закрытия формы можно вызывать функции это формы
и форма при этом снова откроется?


Bellerofont:
Точно! Именно таких вещей у меня много. Поскольку я большой нелюбитель размножать похожие объекты, то у меня даже в одной форме (а в разных - тем более) может быть несколько чайлдов, которые используют одну и ту же форму, но только с разными рекордсурсами, которые подгружаются на всякие ФормОпен и т.п.
Так что это как раз про меня.

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

Все так?

  Ответить  
 
 автор: Bellerofont   (17.06.2008 в 19:33)   личное сообщение
 
 

Я не говорил о вызовах типа
Forms!ИмяФормы!ИмяКонтролаПодчиненнойФормы.Form.ИмяПабликПроцедуры
Это правильный вызов.
Я говорил только о проблемах с Form_ИмяФормы.ИмяПроцедуры.
Вы же такой синтаксис не используете?

  Ответить  
 
 автор: osmor   (18.06.2008 в 09:13)   личное сообщение
 
 

>В этом случае все равно создается экземпляр формы ....
>т.е. фактически форма открывается
это про
Form_frmMyForm.SelfRefresh

ваш втрой вопрос звучал так:
"если форма не открыта, но если я вызову её процедуру, адресуясь к форме "полностью" типа Forms!Main!Child99.Form.SelfRefresh,"


я отвечаю что так обратиться к закрытой форме не получится, т.к. ее нет в коллекция Forms
в первом случае
Form_frmMyForm.SelfRefresh - если форма закрыта, создастся экземпляр
во втором
Forms!Main!Child99.Form.SelfRefresh - если форма MAIN закрыта, будет ошибка

4.
> В этом случае после закрытия формы можно вызывать функции это формы
и форма при этом снова откроется?

нет

  Ответить  
 
 автор: Loser   (18.06.2008 в 11:10)   личное сообщение
 
 

Bellerofont:
такой синтаксис я пока не использую, но вообще-то собирался.
потому что каждый раз прописывать полный путь не очень то хочется, я люблю работать с "константными" вызовами. Хочется где-то (кстати, а где это сделать правильно?) типа в модуле формы Main описать как паблик все потребные чайлды:
Set Child1 = Forms!Main!Child1.Form
Set Child2 = Forms!Main!Child2.Form,
к которым будут адресоваться подобные вызовы, чтобы писать эти вызовы проще:
Child1.SelfRefresh
Child2.SelfRefresh
и т.д.
Причем сделать эти сэты в процедуре FormOpen (или лучше FormLoad?) главной формы,
что гарантирует меня от тех ошибок, о которых предупреждает Osmor.
И все. Поскольку вызывают друг друга чайлды все той же главной формы Main, то я ожидаю, что никаких ошибок возникнуть не может, потому что если закрыта главная форма - то и подавно закрыты все ее чайлды.

Osmor:
а если у меня эта самая MyForm описана как
Set MyForm = Forms!Main!Child1.Form
то разве вызов
MyForm.SelfRefresh не будет давать такую же ошибку как и вызов
Forms!Main!Child1.Form.SelfRefresh ??
Ведь этого адреса то нету при закрытой Main?

Или когда я прописываю этот сэт, то прописывается в него только адрес самой формы, а является ли она чьим-то чайлдом или нет - уже никого не волнует, она будет работать как независимая форма, сама по себе?
И если адрес чайлда в Main'е совпадет с адресом, прописанным в сэте - то это так "получится", что обновление, запущенное MyForm.SelfRefresh "окажется" одновременно обновлением "того самого чайлда"?

Т.е. MyForm.SelfRefresh вызывает обновление именно в MyForm, а не в чайлде, а в чайлде он виден потому что Child1 - это та же самая ссылка, что и MyForm, я все правильно понял?
Т.е. на самом деле до тех пор, пока я уверен, что адреса чайлдов не менялись, а совпадают с теми, которые выставлены в сэтах - мне нет разницы, каким из двух способов вызывать эти рефреши?

  Ответить  
 
 автор: osmor   (18.06.2008 в 11:24)   личное сообщение
 
 

Set MyForm = Forms!Main!Child1.Form - нужно сделать в то время когда формы Main открыта
и если MyForm будет описана на уровне общего модуля, то обращаться к ее функциям можно будет и после закрытия Main

  Ответить  
 
 автор: Loser   (18.06.2008 в 11:38)   личное сообщение
 
 

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

Так что пока я вижу в перспективе лишь ту ошибку, которая возникает из-за того, что при открытии главной формы некоторые ее чайлды могут вызывать другие чайлды раньше, чем они откроются. И при первом вызове (который произойдет при открытии) это лечится простым On Error Resume Next, а когда чайлды уже откроются все - ошибок больше быть не может.
Все так?

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList