Вернуться в нужную форму

Contrast
Дата: 07.01.2012 14:09:40
Знающие люди!

Заблудился...

Имеем несколько последовательно открытых форм. Скажем, из Form1 открыта Form2, из нее в свою очередь Form3. Затем, через контекстное меню (по "правому" клику) вызвана Form00 с передачей OpenArgs. Подчеркиваю - из контекстного меню. По закрытии Form00 нужно произвести некоторые действия (например .Refresh) в форме, из которой был вызов.

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

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

Собственно вопрос - как при вызове через контекстное меню получить ссылку на текущую форму?
Или немного по-другому - можно ли в форме отследить вызов чего-либо через контекстное меню?
nord-woolf
Дата: 07.01.2012 14:25:05
Contrast
...Если же открывать форму через контекстное меню,
то вызов приходится организовывать через процедуру общего модуля...

Совершенно необязательно "через процедуру общего модуля".
Все можно описать в бэк модуле формы (или в сервисном классе),
там же и подписаться на события объекта класса Form или класса бэк модуля формы.
Contrast
Дата: 07.01.2012 15:03:58
nord-woolf
Все можно описать в бэк модуле формы (или в сервисном классе),
там же и подписаться на события объекта класса Form или класса бэк модуля формы.


А попробуй!

контекстное меню (CommandBar) - объект проекта. в нем невиден контекст формы, не доступны процедуры модуля формы. Или под "бэк модулем" понимается что-то иное?
nord-woolf
Дата: 07.01.2012 15:29:03
Contrast
... А попробуй!...

А кули там пробовать, делать надо.

1. Можно в бэк модуле формы (или сервисном классе) подписаться на события контрола(ов) штатного командбара,
и делать необходимое в процедурах обработки событий.

2. Можно (и это более правильно) для каждого инстанса формы создавать свои менюшки,
и обрабатывать клики контролов своих менюшек (в процедурах обработки событий).

3. У меня этим занимаются специально обученные сервисные классы (базовый набор кнопок) +
+ возможность расширения базового набора кнопок и обработка их событий в бэк модуле формы.
Contrast
Дата: 07.01.2012 16:10:18
nord-woolf
2. Можно (и это более правильно) для каждого инстанса формы создавать свои менюшки,
и обрабатывать клики контролов своих менюшек (в процедурах обработки событий).


Прошу прощения, но видимо я чего-то не понимаю.

Попробую по шагам описать.
1. Создаем новый CommandBar с нужным набором кнопок (msoControlButton)
2. У одной из кнопок свойство .OnAction содержит имя процедуры, вызывающей форму с передачей последней OpenArg.
3. в свойстве .ShortcutMenuBar формы прописываем имя созданного в п.1 CommandBar-а

Дальше интереснее.
Если процедура из п.2 помещена в общий модуль - она срабатывает. Если в модуле формы - ошибка "Приложение "Microsoft Office Access" не может вызвать макрос или функцию обратного вызова "ctrlRescan". Убедитесь, что макрос или функция существуют, и что они принимают правильные параметры."

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

На счет класса еще порою в доках, но что-то сомнения гложат...
nord-woolf
Дата: 07.01.2012 16:18:55
Contrast
...
2. У одной из кнопок свойство .OnAction содержит имя процедуры, вызывающей форму с передачей последней OpenArg.
...

Вот вместо этого, описываем в модуле формы типизированную переменную WithEvents,
присваиваем ей значение - ссылку на объект (кнопку меню).
Описываем процедуру обработки события Click объекта этой переменной,
где и решаем поставленные задачи.

Кстати, если форма не PopUp, то для OnAction контекстного меню можно пользовать функции бэк модуля формы.
nord-woolf
Дата: 07.01.2012 16:55:43
Примеры по теме:
4954205 штатное меню

10322843 свое меню с подпиской на события

10322869 свое меню с OnAction (форма не PopUp).
Contrast
Дата: 07.01.2012 18:13:59
nord-woolf,

Ловко, черт возьми!

Пошел учить матчасть...