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

Форум: MS ACCESS

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

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

 
 

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

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

тема: RowSource. Переключение. Работает но прерывает сообщением об ошибке. (2000)
 
 автор: Loser   (07.05.2008 в 19:32)   личное сообщение
 
 

есть строка:
Forms!Main!Child1!Field1.RowSource = "List_01"

вызывается в двух местах:
1. по нажатию кнопки, которая обновляет Main-форму и нужные в ней субформы
(все работает прекрасно)
2. на событии Current в Child0, который отвечает за перелистывание данных в других субформах.
Здесь все работает прекрасно, НО при открытии формы, когда Current активируется самый первый раз, на первой строке - выдается ошибка:
"You entered an expression that has an invalid reference to the property Form/Report"

и предлагается ее дебагать или игнорировать.
при игнорировании ("End") все начинает нормально работать, как и должно было быть.

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

Как ее унять?

  Ответить  
 
 автор: osmor   (07.05.2008 в 22:33)   личное сообщение
 
 

Child1 - это подчиненная форма?
если да, то попробуйте

Forms!Main!Child1.form!Field1.RowSource = "List_01"

кроме того при загрузке на current child0 может быть еще не загружена подчиненная child1

  Ответить  
 
 автор: Анатолий (Киев)   (08.05.2008 в 10:40)   личное сообщение
 
 

Дело в том, что при открытии формы событие Current (и, естественно, Open-Load) субформ происходят по очереди и до события Current главной формы. В этот момент Child1 для Child0 еще недоступна.
Вам нужно проигнорировать эту ошибку, а на Load главной формы вызвать процедуру Click кнопки.

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

Osmor:
я пытался и так и так (хотя и не понимаю, в чем разница, ведь работает и без этого дополнительного указания .Form). ругается абсолютно одинаково.

Анатолий:
а можно ли сделать так, чтобы чайлды отслеживали друг друга, кто уже открыт а кто нет и не пытались заставить работать того, кто еще не открылся?

> Вам нужно проигнорировать эту ошибку
а как это делается? нажимать каждый раз End - мне не нравится.

Нашел топорный выход, который работает:

Dim ChildOpen

If ChildOpen = 0 Then
ChildOpen = 1
Else
Forms!Main!Child1!Field1.RowSource = "List_01"
End If

никаких сообщений об ошибке больше не происходит, все работает.
Но не является ли такой способ диким извратом?

  Ответить  
 
 автор: Bellerofont   (08.05.2008 в 11:58)   личное сообщение
 
 

On Error Resume Next

  Ответить  
 
 автор: osmor   (08.05.2008 в 12:33)   личное сообщение
 
 

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

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

Bellerofont :
спасибо. все получилось. гораздо проще моего ужаса.
вопрос. если у меня в процедуре много сомнительных моментов - эта строчка подействует:
1. только на первую следующую строчку?
2. или на первую следующую за ней ошибку, если она встретится за ней?
3. или на все, следующие за ней?

если третье - как выключить этот режим?


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

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

ну не могу сказать что обязательно будут проблемы, просто иерархия такова
Forms!Main.Controls("Child1").Form!Controls("Field1").RowSource
1.Коллекция Forms
2. В ней Форма с именем Main
3. в этой форме коллекция контролов и в этой коллекции контрол (подчиненная форма) Child1
4. У этого контрола есть свойство Form содержащее ссылку на объект формы открытой в этом контроле
5. В объекте Form есть коллекция контролов и в этой коллекции контрол Field1
6. у контрола Field1 свойство RowSource

Но существуют свойства по умолчанию, т.е. если к кобъекту обратиться явно неуказывая свойства, то VBA сам пытается понять, что от него хотят толи сам объект, толи его свойство по умолчанию.
Например

dim obj as control
dim S as string
set obj = Me.Поле
s = Me.Поле

obj - будет содержать объект контрол
s - значение свойства Value (которое является свойством по умолчанию)

У Формы свойством по умолчанию является свойство Controls содержащее коллекцию Controls, у контрола Подчиненная формасвойством по умолчанию (видимо) является свойство Form, но я не знаю когда это появилось, наскоклько я помню в MSA 97 требовалось для обращения к подчиненной форме указывая свойство Form, возможно в более поздних версиях это не так, не поверял, поскольку всегда пишу Form.

  Ответить  
 
 автор: Анатолий (Киев)   (08.05.2008 в 14:18)   личное сообщение
 
 

>эта строчка подействует..
Laser, если бы задали такой вопрос на SQL.ru, то сразу нарвались бы на большую Ф1 с соответствующими комментариями.
Вы для начала попробуйте почитать HELP про "On Error Statement", а если чего-то не поймете, тогда - сюда.

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