Доброго времени суток, Посетитель!
|
|
|
|
|
|
|
|
|
вид форума:
|
|
|
|
| есть отдельный модуль с функциями и переменными - к нему спокойно можно обратиться откуда угодно и почти :( как угодно, лишь бы то, к чему обращаются было Public.
вопрос: как обращаться к функциям, находящимся в модулях самих форм? в некоторой форме есть функция SelfRefresh, которая сама знает что ей делать, но я совершенно не хочу прописывать эту гадость во ВСЕХ других формах, которые могут захотеть обновить эту форму.
т.е. должно быть в самой форме:
Public Sub SelfRefresh()
(все нужные действия)
End Sub
а везде, где это понадобится, - что-то типа Call ????.SelfRefresh.
БЕЗ вникания, как внутри устроена этв дурацкая форма, каких чайлдов в ней надо обновлять, а каких нет и т.д.
Но как?? :( | |
|
| |
|
|
|
| если фома не открыта, то никак.
смысл в том, что в формах свои процедуры и функции.
если хотите, чтобы они были доступны из любого места программы - объявляйте их в модулях.
и нечего тут нюни распускать | |
|
| |
|
|
|
|
если фома не открыта, то никак
|
Почему же никак....
Нужно просто писать полное имя модуля, процедура или функция к которй обращаются должна быть Public.
Form_frmMyForm.SelfRefresh | |
|
| |
|
|
|
| В этом случае все равно создается экземпляр формы и выполняются все события происходящие при обычном (DoCmd) открытии формы типа onLoad и т.п.
т.е. фактически форма открывается | |
|
| |
|
|
|
|
| Да и Public она при таком вызове не обязательно должна быть ... | |
|
| |
|
|
|
| Точно, признаю свою глупость. Такие вызовы чреваты | |
|
| |
|
|
|
| Силыч:
формы все открыты, с ними все в порядке, просто это несколько чайлдов одной главной формы приказывают друг другу обновиться.
почему я хочу именно в своем описывать - потому что эта процедура только к своей форме и относится, остальные модули, формы и прочее ее потроха волновать не должны.
Осмор:
поясни, что ты имеешь в виду? я тебя понял так, что когда я пишу свое обращение, то команда отправляется не в уже открытую форму, а ради это она открывается ЕЩЕ РАЗ??
или я второй день ничего не соображаю?
Беллерофонт:
прочитал, но не все понял. Они там обсуждают обращение к эвенту, который и сам по себе работает, а мне надо гораздо меньше чем им.
All:
то ли руки у меня вчера кривые были, то ли еще что-то, но сегодня строчка
Parent!Child1.Form.SelfRefresh
- прекрасно работает (в том модуле - просто Public Sub). То ли я ее вчера криво писал, то ли не ее писал, то ли я перед ней обязательно Call хотел вставить, не понял :(
Но, с учетом всего этого и того (по ссылке) обсуждения, остался вопрос:
а таки чем же такие вызовы чреваты? | |
|
| |
|
|
|
| вызов типа Form_frmMyForm.SelfRefresh
чреват тем, что если форма не открыта в данный момент, то создастся ее экземпляр, в котором отработают все события которые должны произойти при открытии формы, а это не всегда желательно | |
|
| |
|
|
|
| Osmor:
правильно ли я понимаю:
1. если форма уже открыта - этот вызов найдет именно ее, и такой вызов не будет чреват ничем, причем нет разницы, является ли эта форма чьим-то чайлдом или нет - Акцесс найдет именно ее?
2. если форма не открыта, но если я вызову её процедуру, адресуясь к форме "полностью" типа Forms!Main!Child99.Form.SelfRefresh, то форма эта будет открыта, причем она откроется именно как чайлд моей главной формы, и мне, собственно, будет абсолютно наплевать, что это было на самом деле коряво?
3. если форма не открыта, но её процедуру я вызову, адресуясь не с "полным путем" (как в п.2), а, например, где-то заранее, например, на FormOpen, запомнив на нее ссылку типа Set НужнаяФорма = ...... (как-нибудь по-кривому написанная ссылка), то когда я ее вызову - она создастся сама по себе, а когда главная форма таки дотормозит до конца, и создаст своего чайлда99, то это будет дубликат, и все, что там наработала вызванная процедура раньше, к новосозданному чайлду не будет иметь никакого отношения?
все ли так?
если да, то как, собственно, должна выглядеть кривонаписанная ссылка из п.3, чтобы было невозможное нормальное течение дел, как я описал в п.2? потому что как я себе это представляю, то если Set написан по уму, т.е. Me!Child и т.д. - то и откроется она как чайлд, а если нет - то я сам виноват, что фигню написал. | |
|
| |
|
|
|
| "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 | |
|
| |
|
|
|
|
"1. если форма уже открыта - этот вызов найдет именно ее, и такой вызов не будет чреват ничем, причем нет разницы, является ли эта форма чьим-то чайлдом или нет - Акцесс найдет именно ее?"
да
|
Но следует учитывать, что фожет быть открыто несколько экземпляров формы (например, открыто несколько форм, в которой нужная форма используется в качестве подчиненной),
а код будет выполнен лишь в одной форме.
(речь о Form_ИмяФормы) | |
|
| |
|
|
|
| Osmor:
1.
>да
я реально счастлив.
2.
вы писали ранее:
>В этом случае все равно создается экземпляр формы ....
>т.е. фактически форма открывается
и теперь:
>нет. Вы не сможете так обратиться к НЕ открытой форме, т.к.
>в коллекцию Forms попадают только открытые формы
я не в состоянии это понять. разве эти две вещи не взаимоисключают друг друга???
вторую то вещь я как раз понимаю, с этим я сталкиваюсь каждый раз, когда у меня чайлды передают приказы друг другу, и мне эпизодически приходится писать в коде On Error Resume Next, чтобы при первом проходе, когда некоторые чайдлы еще не открыты - не выскакивали сообщения об ошибке, это я знаю. но что вы имели в виду ранее под "форма открывается"?
3. это не вы, это я все никак не могу понять, как выглядит та ситуация, когда запрошенные мной действия (процедуры) происходят не в той форме, которая мне нужна, а в какой-то левой, которая у нас "чреватая"
4.
> В этом случае после закрытия формы можно вызывать функции это формы
и форма при этом снова откроется?
Bellerofont:
Точно! Именно таких вещей у меня много. Поскольку я большой нелюбитель размножать похожие объекты, то у меня даже в одной форме (а в разных - тем более) может быть несколько чайлдов, которые используют одну и ту же форму, но только с разными рекордсурсами, которые подгружаются на всякие ФормОпен и т.п.
Так что это как раз про меня.
Но, вы имеете в виду, что если у меня открыто много экземпляров одной и той же форме - я могу нарваться на то, что код выполнится не в той в которой мне надо? Но я же пишу открытым текстом, какой чайлд какой формы обновить, разве нет? Почему выполнится в другой?
Или вы имеете в виду, что выполнится то он как раз в той, что надо, но только в ней одной, а во всех других таких же - нет? Так по-моему это как раз правильно, потому что приказ обновить чайлд надо писать явно, и если одни две формы я обновить хочу, а другие три (те же самые) - нет, так и не должно это происходить.
Все так? | |
|
| |
|
|
|
| Я не говорил о вызовах типа
Forms!ИмяФормы!ИмяКонтролаПодчиненнойФормы.Form.ИмяПабликПроцедуры
Это правильный вызов.
Я говорил только о проблемах с Form_ИмяФормы.ИмяПроцедуры.
Вы же такой синтаксис не используете? | |
|
| |
|
|
|
| >В этом случае все равно создается экземпляр формы ....
>т.е. фактически форма открывается
это про
Form_frmMyForm.SelfRefresh
ваш втрой вопрос звучал так:
"если форма не открыта, но если я вызову её процедуру, адресуясь к форме "полностью" типа Forms!Main!Child99.Form.SelfRefresh,"
я отвечаю что так обратиться к закрытой форме не получится, т.к. ее нет в коллекция Forms
в первом случае
Form_frmMyForm.SelfRefresh - если форма закрыта, создастся экземпляр
во втором
Forms!Main!Child99.Form.SelfRefresh - если форма MAIN закрыта, будет ошибка
4.
> В этом случае после закрытия формы можно вызывать функции это формы
и форма при этом снова откроется?
нет | |
|
| |
|
|
|
| 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, я все правильно понял?
Т.е. на самом деле до тех пор, пока я уверен, что адреса чайлдов не менялись, а совпадают с теми, которые выставлены в сэтах - мне нет разницы, каким из двух способов вызывать эти рефреши? | |
|
| |
|
|
|
| Set MyForm = Forms!Main!Child1.Form - нужно сделать в то время когда формы Main открыта
и если MyForm будет описана на уровне общего модуля, то обращаться к ее функциям можно будет и после закрытия Main | |
|
| |
|
|
|
| усвоил.
в данный момент я придерживаюсь той философии, что те функции, которые могут понадобиться в то время, когда форма с их описанием закрыта, - и прописаны должны быть не в ее модуле, а в отдельном, к ней не относящемся.
Так что пока я вижу в перспективе лишь ту ошибку, которая возникает из-за того, что при открытии главной формы некоторые ее чайлды могут вызывать другие чайлды раньше, чем они откроются. И при первом вызове (который произойдет при открытии) это лечится простым On Error Resume Next, а когда чайлды уже откроются все - ошибок больше быть не может.
Все так? | |
|
| |
HiProg.com - Технологии программирования
|