![]() |
|
Вопрос при закрытии произвольной формы | ☑ | ||
---|---|---|---|---|
0
Csar
16.03.18
✎
13:54
|
Добрый день, коллеги.
Столкнулся с простой казалось бы задачей, но вопрос при закрытии произвольной формы что-то не удается решить. Есть ОбщаяФорма, которая вызывается из ФормыДокумента. ОбщуюФорму можно закрыть нажав кнопку Да или кнопку Отмена. Так же можно закрыть крестиком или через Esc. 1) При нажатии на кнопку Да возвращаем Текст в ФормуДокумента. 2) При нажатии на кнопку Отмена: появляется вопрос типа "Вы хотите сохранить изменения? Да/Нет" - если нажали на Да, то в ФормуДокумента возвращается Текст, если нет, то возвращается КодВозвратаДиалога.Отмена. 3) При выходе из формы через Esc или крестик справа вверху формы, то действовать как в п. 2) Так вот первые 2 пункта я реализовал, а вот с третьим не могу, т.к. нет обработчика события такого. Если в ПередЗакрытием впихнуть обработку всей логики с итоговыми процедурами "Закрыть(...)", то не понятно как вызвать обработчик ПередЗакрытием при нажатии на кнопки Да или Отмена. |
|||
1
Csar
16.03.18
✎
14:03
|
Вот что у меня вышло для первых двух пунктов:
&НаКлиенте
|
|||
2
Csar
16.03.18
✎
14:31
|
Есть ли у кого-нибудь идеи как реализовать третий пункт?
|
|||
3
Buster007
16.03.18
✎
14:47
|
При отмене надо просто закрывать форму. Сработает процедура ПередЗакрытием
в перед закрытием пишешь Если ЗадалиВопрос Тогда Возврат; КонецЕсли; твой код с вопросом с результатом закрытия формы ЗадалиВопрос = Истина; Оповестить о выборе надо делать в при закрытии |
|||
4
Csar
16.03.18
✎
15:05
|
При Отмене - это при нажатии на кнопку Отмена? И закрывать - это вызывать процедуру Закрыть()?
|
|||
5
Csar
16.03.18
✎
15:08
|
У меня получается так, что если я обработаю так:
&НаКлиенте Процедура Отмена(Команда) ... Закрыть(); КонецПроцедуры &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) ... КодСЗаданиемВопроса(); Закрыть(); ... КонецПроцедуры То с таком случае, вопрос задается дважды, т.е. в "ПередЗакрытием" заходит дважды |
|||
6
Csar
16.03.18
✎
15:16
|
(3) Как просто закрывать форму?
Если через Закрыть(), то что бы я не возвращал в "ПередЗакрытием" - все равно ничего не возвращается. |
|||
7
Mankubus
16.03.18
✎
15:39
|
Не надо вообще ничего писать в отмене. Надо оставить стандартную кнопку Отмена, она закрывает форму
|
|||
8
Csar
16.03.18
✎
15:51
|
(7) если оставить обработку кнопки Да с процедурой Закрыть(), то после вызова процедуры Закрыть() в "ПередЗакрытием" программа снова сюда заходит. В итоге дважды задается вопрос.
|
|||
9
Buster007
16.03.18
✎
15:56
|
зачем ты вызываешь в процедуре перед закрытием метод Закрыть()? Форма и так уже закрывается
|
|||
10
Csar
16.03.18
✎
16:00
|
А как иначе вернуть требуемое значение?
|
|||
11
Buster007
16.03.18
✎
16:05
|
а как возврат значения связан с методом Закрыть()
|
|||
12
Csar
16.03.18
✎
16:08
|
(11) Закрыть(ВозвращаемоеЗначение)
В итоге что я имею сейчас: 1) &НаКлиенте Процедура OK(Команда) КодОтвета = "Да"; ОповеститьОВыборе(Текст); Закрыть(Текст); КонецПроцедуры 2) Кнопка Отмена берется системная без ручного обработчика 3) &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) ОтветНаВопрос = Ложь; Если ПереспрашиватьПриОтмене И Модифицированность И КодОтвета <> "Да" Тогда ТекстВопрос = ?(ОтображениеДанныхНаАнглийском, "Do you want to save changes?", "Вы хотите сохранить изменения?"); ТекстЗаголовка = ?(ОтображениеДанныхНаАнглийском, "Saving data changes", "Сохранение введенных данных"); ОтветНаВопрос = Вопрос(ТекстВопрос, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, ТекстЗаголовка) = КодВозвратаДиалога.Да; КодОтвета = ?(ОтветНаВопрос = Истина, "Да", "Нет"); КонецЕсли; КонецПроцедуры 3) &НаКлиенте Процедура ПриЗакрытии() Если КодОтвета = "Да" Тогда ОповеститьОВыборе(Текст); Закрыть(Текст); Иначе Закрыть(КодВозвратаДиалога.Отмена); КонецЕсли; КонецПроцедуры В 3) программа ругается на Закрыть(ВозвращаемоеЗначение); |
|||
13
Csar
16.03.18
✎
16:09
|
Да, наверное надо было упомянуть о том, что у меня модальное окошко и его вызов должен напрямую вернуть Значение.
|
|||
14
Csar
16.03.18
✎
16:18
|
(11) я использую не метод, а процедуру.
|
|||
15
Buster007
16.03.18
✎
16:35
|
у ОткрытьФорму есть такой параметр как ОписаниеОповещенияОЗакрытии. Почитай
|
|||
16
Buster007
16.03.18
✎
16:35
|
(13) вместо модального вызова формы следует использовать не модальный с указанием параметра БлокироватьОкноВладельца
|
|||
17
Buster007
16.03.18
✎
16:36
|
+(15) не, не катит. Тогда тебе надо использовать метод формы Закрыть, как ты и делаешь.
В таком случае надо просто использовать Оповестить |
|||
18
Csar
16.03.18
✎
16:45
|
(17) так вот и получается, что если я использую Закрыть(Текст) в обработчике кнопки ОК, а потом и при Закрытии обработки в случае, если юзер нажал Отмена, а потом решил все же сохранить данные, то опять вызываю Закрыть(Текст), то все равно возвращается неопределено.
|
|||
19
h-sp
16.03.18
✎
19:28
|
(18) выкиньте ПриЗакрытии, она нахрен не нужна, делайте всё в ПередЗакрытием
И не забывайте Отказ=Истина, если вдруг повторно Закрыть вызывается. |
|||
20
Csar
18.03.18
✎
12:02
|
Придумал таки решение. Оказалось все действительно просто - надо лишь понять какое действие вызывает событие. Если не кнопка, то своя логика, если кнопка, то логика обрабатывается ТОЛЬКО в действиях кнопки:
&НаКлиенте Процедура OK(Команда) ВыбранноеДействие = "Да"; ОповеститьОВыборе(Текст); Закрыть(Текст); КонецПроцедуры &НаКлиенте Процедура Отмена(Команда) ВыбранноеДействие = "Отмена"; ОтветНаВопрос = Вопрос("Сохранить?", РежимДиалогаВопрос.ДаНет); Если ОтветНаВопрос = КодВозвратаДиалога.Да Тогда ВыбранноеДействие = "Да"; ОповеститьОВыборе(Текст); Закрыть(Текст); Иначе ВыбранноеДействие = "Отмена"; Закрыть(КодВозвратаДиалога.Отмена); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка) Если НЕ (ВыбранноеДействие = "Отмена" ИЛИ ВыбранноеДействие = "Да") Тогда ОтветНаВопрос = Вопрос("Сохранить?", РежимДиалогаВопрос.ДаНет); Если ОтветНаВопрос = КодВозвратаДиалога.Да Тогда ВыбранноеДействие = "Да"; ОповеститьОВыборе(Текст); Закрыть(Текст); Иначе ВыбранноеДействие = "Отмена"; Закрыть(КодВозвратаДиалога.Отмена); КонецЕсли; КонецЕсли; КонецПроцедуры |
|||
21
Cyberhawk
18.03.18
✎
12:03
|
Много букв. Сколько платят за решение вопроса?
|
|||
22
Cool_Profi
18.03.18
✎
12:15
|
(20) 1с - доступно и всеръёз!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |