Ошибка выполнения Microsoft Access 2455 при попытке доступа к формам внуков из дочерней формы
У меня есть три формы в базе данных Access 2003 (разрабатываемой в Access 2007), которые находятся в отношениях родитель -> ребенок -> внук. В подпункте "Form_Load" дочерней формы я установил некоторые свойства внука (заголовок формы, источник строки и управляющая логика). Когда я смотрю дочернюю форму, все работает правильно. Когда я просматриваю родительскую форму, я получаю ошибку:
Ошибка времени выполнения "2455": вы ввели выражение, которое имеет недопустимую ссылку на свойство Форма / Отчет.
со ссылкой на строку:
Me.GrandchildFormName.Form.Foo.Caption = "bar"
Я могу получить доступ к любому свойству формы внука, кроме свойства формы, без каких-либо ошибок. Кто-нибудь знает, что может быть причиной этого? Я сделал тестовый пример в новой базе данных, и он работал нормально, поэтому я склоняюсь к тому, что что-то есть в унаследованном коде, который я унаследовал с базой данных (который, как мне сказали, восходит на 18 лет до предварительного доступа система баз данных), которая вызывает проблему, но я решил проверить здесь, чтобы узнать, есть ли у кого-нибудь из вас обходной путь.
Если это уместно, фактическая структура форм немного сложнее, с формой внука, которая появляется несколько раз (под разными именами элементов управления) в дочерней форме, например так:
|--------------|
| A |
| |----------||
| | B ||
| | |------|||
| | | C[1] |||
| | |------|||
| | ||
| | |------|||
| | | C[2] |||
| | |------|||
| |----------||
|--------------|
Устранение всех, кроме одной из форм внуков, не решает проблему.
Я мог бы написать код, чтобы обойти проблему, если бы у формы внука был способ узнать, в какой из экземпляров она загружается, но, насколько я знаю, это невозможно.
2 ответа
Я использую Parent
, Child
, а также GrandChild
для ссылки на соответствующие формы (не источники данных).
Как правило, Form
Свойство элемента управления подчиненной формы получает "действительную ссылку" только после того, как подчиненная форма показана. Таким образом, если вы хотите выполнить код в Child.Form_Load
, вы должны убедиться, что GrandChild
виден когда Parent
открывается.
Решение
Так как я предполагаю, что в вашем случае GrandChild
виден, если вы открываете Child
(без открытия Parent
) но GrandChild
не видно при открытии Parent
Я бы предложил следующее решение без изменения вашего интерфейса:
Переместить код Child.Form_Load
, который обращается GrandChild.Form
в GrandChild.Form_Load
, Всякий раз, когда GrandChild
загружает это может получить доступ ко всему из Child
(Me.Parent.Form
) или даже Parent
(Me.Parent.Parent.Form
).
Другими словами GrandChild
должен вытащить информацию (от Child
или же Parent
) и меняй себя вместо Child
толкая информацию до GrandChild
путем изменения GrandChild
,
Пример:
Скажем Parent
имеет отношение 1:n к Child
а также Child
имеет отношение 1:n к GrandChild
, Parent
подарки Child
в качестве таблицы данных, таким образом, GrandChild
не отображается, когда Parent
открывается. В этом случае любой доступ к GrandChild.Form
приводит к ошибке во время выполнения 2455 с GrandChild
не отображается
В этом примере каждая строка Child
Таблица данных имеет символ плюс, который позволяет показать GrandChild
, Допустим, вы положили кнопку на Parent
который выполняет код, который у вас есть в вашем Child.Form_Load
к югу. Нажав на эту кнопку после Parent
открывает результаты с ошибкой (см. выше), но если вы нажмете на один из символов плюс в Child
а затем нажмите на кнопку, код будет выполняться без ошибки 2455, так как в этом случае GrandChild
было сделано видимым до GrandChild.Form
доступ был выполнен.
Чуть выше строки, указывающей тип проблемы: On Error Resume Next
Запустите его, и это решит вашу проблему. После одного запуска вы можете стереть линию и продолжите работать.