Не закрывать форму по esc 1с

Обновлено: 05.07.2024

Повторный вызов одноименного метода не оказывает влияние на состояние блокировки.

Пример использования:

Для Н=1 По 100000 Цикл

Начиная с версии 2.x.x.x добавлены методы работы с экраном.

Сохраняет область экрана в файл (формат BMP) или в оперативную память.

<Режим> - Позволяет задать относительно чего используются координаты области:

0 - Относительно рабочего стола Windows.

-1 - Относительно основного окна 1С.

Число (отличное от 0 или -1) - Относительно формы. В качестве значения необходимо передать HWND окна формы, которое можно получить с помощью объекта "РасширениеФормы" или "АтрибутФормы" из атрибута (свойства) "Дескриптор" внешней компоненты FormEx™.

<Лево> - Расстояние от левой границы стола/окна/формы до левой границы области.

<Верх> - Расстояние от верхней границы стола/окна/формы до верхней границы области.

<Ширина> - Ширина области.

<Высота> - Высота области.

<ИмяФайла> - Строковое выражение с именем файла. Если не задано, область сохраняется в оперативной памяти.

<Флаг2> - Управляет контролем полной видимости области на экране. Если задано значение отличное от нуля, то контроль отключается.

<0 - Операция не выполнена.

=0 - Никогда не возвращается.

>0 - Успешное завершение.

Сравнивает образ, заданный в параметрах вызова данного метода, с образом (ранее сохраненного методом "Save") в оперативной памяти.

<Режим>,<Лево>,<Верх>,<Ширина>,<Высота>,<Флаг2> - Описание эквивалентно описанию параметров метода "Save".

<Флаг1> - Управляет удалением образа (ранее сохраненного методом "Save") из оперативной памяти. Если задано значение отличное от нуля, то образ не удаляется из оперативной памяти до очередного вызова метода "Save" или до завершения сессии 1С. В противном случае (нулевое значение или отсутствует) образ удаляется после выполнения метода "Compare".

<0 - Операция не выполнена.

=0 - Образ (ранее сохраненный методом "Save") отличается от образа определенного координатами вызова метода "Compare".

>0 - Образ (ранее сохраненный методом "Save") равен образу определенного координатами вызова метода "Compare".

Возвращает значение уточняющего кода возврата, если из методов "Save" и "Compare" вернулось значение меньше нуля. Предыдущее значение уточняющего кода возврата сбрасывается в начале выполнения всех методов, кроме "GetRetCod". Значение уточняющего кода возврата сбрасывается после выполнения "GetRetCod".

0 - Нет причин для установки значения уточняющего кода возврата.

1-5 - Системные проблемы. Следует обратиться к разработчику MagicEsc.

6-16 - Сбой при записи файла в методе "Save", заданного параметром <ИмяФайла>.

17 - В параметр <Режим> передан неверный HWND окна формы.

22 - В параметр <Режим> передан неверный HWND окна формы.

23-30 - Область не имеет полной видимости на экране, а значение параметра <Флаг2> равно нулю или параметр отсутствует.

31 - Системные проблемы. Следует обратиться к разработчику MagicEsc.

32 - Площадь образа (ранее сохраненного методом "Save") отличается от площади образа определенного координатами в вызове метода "Compare". Или образ отсутствует в оперативной памяти.

33-35 - Системные проблемы. Следует обратиться к разработчику MagicEsc.

Позволяет управлять уровнем выдачи отладочной информации.

<Уровень> - Позволяет задать уровень детализации выдаваемой отладочной информации.

<0 - Отключает выдачу отладочной информации.

=0 - Отключает выдачу отладочной информации.

>0 - Включает выдачу отладочной информации. Минимальный уровень детализации - единица. Если уровень задан более допустимого в MagicEsc, то используется максимально возможный.

Ничего не возвращает - вызывается как процедура.

Позволяет получить ширину и высоту текста в пикселях.

<Режим> - Описание эквивалентно описанию параметра метода "Save".

<Шрифт> - Задаёт шрифт, которым планируется отображать текст. В качестве значения необходимо передать значение из атрибута (свойства) "Шрифт" объекта "АтрибутФормы" внешней компоненты FormEx™.

<Текст> - Задаёт текст, который планируется отображать.

<0 - Операция не выполнена.

=0 - Передан текст нулевой длины.

>0 - Успешное завершение. Возвращаемая величина будет содержать ширину текста в пикселях - как целое от деления на 10000, а высоту текста в пикселях - как остаток от деления на 10000. Пример: SizeX=Цел(RetVal/10000); SizeY=RetVal%10000;

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

(2)
Михаил (tango).
А разве в 8.х еще не сделана такая возможность на уровне платформы?
Технологии в ней уже новые. :-) Внешняя компонента только для одного - для перехвата нажатии одной единственной клавиши? Как-то не кошерно это :-) (4)
Ваня (zk96).
Вот есть ВК, где не "только для одного": http://dev.1tsm.ru/project/110
Есть еще масса ВК, где нет именно этого - "одного". ;-) То, что человек написал свою внешнюю компоненту - это очень хорошо, за это плюс. Достаточно одинэсников которые понятия не имеют, как это сделать.
Но загружать компоненту только ради ОДНОГО действия?
Я использую для блокировки Esc FormEx.
P.S. Эо все сугубо мое личное мнение. Зачем проверять, я ИСПОЛЬЗУЮ это. Обрабатываю событие глобальника ПриНажатииКнопкиКлавиатуры и если установлен флаг БлокироватьESCAPE, то устанавливаю ФСО в ноль. Что-то не понятное написал.Лучше приведу код в глобальном модуле(при загруженом 1CPP и FormEx):
Процедура ПриНажатииКнопкиКлавиатуры(КонтекстФормы,КодКлавиши,Alt,Shift,Ctrl,Символ,ФСО)
Клавиатура = СоздатьОбъект("1cpp.Клавиатура");
Если (Клавиатура.VK_ESCAPE = КодКлавиши)и(БлокироватьESCAPE = 1) Тогда
ФСО = 0;
КонецЕсли;
КонецПроцедуры
БлокироватьESCAPE - это экспортная переменная
P.S. Лично у меня это используется в классе-перехватчике. (9)
Ваня (zk96).
Проверил. Да - ловит FormEx клавишу.
Видимо, ТОГДА у меня руки и голова были кривее чем сейчас.
Но, т.к. я не использую FormEx и задача была не совсем в написании данной ВК, то немного себя оправдаю. Думаю, пусть эта ВК лежит на сайте - может кто еще не использует FormEx. ;-)

Я нашел ТУ версию FormEx-а. Могу выслать. :-)

(9),(10)
Мужики, вы тут такие умные, а мы с Ерохой дураки, не проверили.
А теперь попробуйте вот так:
Процедура Сформировать()
До=1000000;
Для А=1 По До Цикл
Состояние(""+А+ "из "+До);
КонецЦикла;
КонецПроцедуры

Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Alt, Shift, Ctrl, Символ, ФСО)
Сообщить("Нажата "+КодКлавиши);
// вообще все блокируем
ФСО=0;
КонецПроцедуры

Открываем обработку, жмем Esc - все класс!, пишет, что нажата, не обрабатывает.
Жмем Сформировать, уходим в цикл. Жмем Ecs - получаем, что на картинке.
Насколько помню, ИМЕННО О ЦИКЛЕ вопрос стоял, а не ВООБЩЕ

Повторный вызов одноименного метода не оказывает влияние на состояние блокировки.

Пример использования:

Для Н=1 По 100000 Цикл

Начиная с версии 2.x.x.x добавлены методы работы с экраном.

Сохраняет область экрана в файл (формат BMP) или в оперативную память.

<Режим> - Позволяет задать относительно чего используются координаты области:

0 - Относительно рабочего стола Windows.

-1 - Относительно основного окна 1С.

Число (отличное от 0 или -1) - Относительно формы. В качестве значения необходимо передать HWND окна формы, которое можно получить с помощью объекта "РасширениеФормы" или "АтрибутФормы" из атрибута (свойства) "Дескриптор" внешней компоненты FormEx™.

<Лево> - Расстояние от левой границы стола/окна/формы до левой границы области.

<Верх> - Расстояние от верхней границы стола/окна/формы до верхней границы области.

<Ширина> - Ширина области.

<Высота> - Высота области.

<ИмяФайла> - Строковое выражение с именем файла. Если не задано, область сохраняется в оперативной памяти.

<Флаг2> - Управляет контролем полной видимости области на экране. Если задано значение отличное от нуля, то контроль отключается.

<0 - Операция не выполнена.

=0 - Никогда не возвращается.

>0 - Успешное завершение.

Сравнивает образ, заданный в параметрах вызова данного метода, с образом (ранее сохраненного методом "Save") в оперативной памяти.

<Режим>,<Лево>,<Верх>,<Ширина>,<Высота>,<Флаг2> - Описание эквивалентно описанию параметров метода "Save".

<Флаг1> - Управляет удалением образа (ранее сохраненного методом "Save") из оперативной памяти. Если задано значение отличное от нуля, то образ не удаляется из оперативной памяти до очередного вызова метода "Save" или до завершения сессии 1С. В противном случае (нулевое значение или отсутствует) образ удаляется после выполнения метода "Compare".

<0 - Операция не выполнена.

=0 - Образ (ранее сохраненный методом "Save") отличается от образа определенного координатами вызова метода "Compare".

>0 - Образ (ранее сохраненный методом "Save") равен образу определенного координатами вызова метода "Compare".

Возвращает значение уточняющего кода возврата, если из методов "Save" и "Compare" вернулось значение меньше нуля. Предыдущее значение уточняющего кода возврата сбрасывается в начале выполнения всех методов, кроме "GetRetCod". Значение уточняющего кода возврата сбрасывается после выполнения "GetRetCod".

0 - Нет причин для установки значения уточняющего кода возврата.

1-5 - Системные проблемы. Следует обратиться к разработчику MagicEsc.

6-16 - Сбой при записи файла в методе "Save", заданного параметром <ИмяФайла>.

17 - В параметр <Режим> передан неверный HWND окна формы.

22 - В параметр <Режим> передан неверный HWND окна формы.

23-30 - Область не имеет полной видимости на экране, а значение параметра <Флаг2> равно нулю или параметр отсутствует.

31 - Системные проблемы. Следует обратиться к разработчику MagicEsc.

32 - Площадь образа (ранее сохраненного методом "Save") отличается от площади образа определенного координатами в вызове метода "Compare". Или образ отсутствует в оперативной памяти.

33-35 - Системные проблемы. Следует обратиться к разработчику MagicEsc.

Позволяет управлять уровнем выдачи отладочной информации.

<Уровень> - Позволяет задать уровень детализации выдаваемой отладочной информации.

<0 - Отключает выдачу отладочной информации.

=0 - Отключает выдачу отладочной информации.

>0 - Включает выдачу отладочной информации. Минимальный уровень детализации - единица. Если уровень задан более допустимого в MagicEsc, то используется максимально возможный.

Ничего не возвращает - вызывается как процедура.

Позволяет получить ширину и высоту текста в пикселях.

<Режим> - Описание эквивалентно описанию параметра метода "Save".

<Шрифт> - Задаёт шрифт, которым планируется отображать текст. В качестве значения необходимо передать значение из атрибута (свойства) "Шрифт" объекта "АтрибутФормы" внешней компоненты FormEx™.

<Текст> - Задаёт текст, который планируется отображать.

<0 - Операция не выполнена.

=0 - Передан текст нулевой длины.

>0 - Успешное завершение. Возвращаемая величина будет содержать ширину текста в пикселях - как целое от деления на 10000, а высоту текста в пикселях - как остаток от деления на 10000. Пример: SizeX=Цел(RetVal/10000); SizeY=RetVal%10000;

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

(2)
Михаил (tango).
А разве в 8.х еще не сделана такая возможность на уровне платформы?
Технологии в ней уже новые. :-) Внешняя компонента только для одного - для перехвата нажатии одной единственной клавиши? Как-то не кошерно это :-) (4)
Ваня (zk96).
Вот есть ВК, где не "только для одного": http://dev.1tsm.ru/project/110
Есть еще масса ВК, где нет именно этого - "одного". ;-) То, что человек написал свою внешнюю компоненту - это очень хорошо, за это плюс. Достаточно одинэсников которые понятия не имеют, как это сделать.
Но загружать компоненту только ради ОДНОГО действия?
Я использую для блокировки Esc FormEx.
P.S. Эо все сугубо мое личное мнение. Зачем проверять, я ИСПОЛЬЗУЮ это. Обрабатываю событие глобальника ПриНажатииКнопкиКлавиатуры и если установлен флаг БлокироватьESCAPE, то устанавливаю ФСО в ноль. Что-то не понятное написал.Лучше приведу код в глобальном модуле(при загруженом 1CPP и FormEx):
Процедура ПриНажатииКнопкиКлавиатуры(КонтекстФормы,КодКлавиши,Alt,Shift,Ctrl,Символ,ФСО)
Клавиатура = СоздатьОбъект("1cpp.Клавиатура");
Если (Клавиатура.VK_ESCAPE = КодКлавиши)и(БлокироватьESCAPE = 1) Тогда
ФСО = 0;
КонецЕсли;
КонецПроцедуры
БлокироватьESCAPE - это экспортная переменная
P.S. Лично у меня это используется в классе-перехватчике. (9)
Ваня (zk96).
Проверил. Да - ловит FormEx клавишу.
Видимо, ТОГДА у меня руки и голова были кривее чем сейчас.
Но, т.к. я не использую FormEx и задача была не совсем в написании данной ВК, то немного себя оправдаю. Думаю, пусть эта ВК лежит на сайте - может кто еще не использует FormEx. ;-)

Я нашел ТУ версию FormEx-а. Могу выслать. :-)

(9),(10)
Мужики, вы тут такие умные, а мы с Ерохой дураки, не проверили.
А теперь попробуйте вот так:
Процедура Сформировать()
До=1000000;
Для А=1 По До Цикл
Состояние(""+А+ "из "+До);
КонецЦикла;
КонецПроцедуры

Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Alt, Shift, Ctrl, Символ, ФСО)
Сообщить("Нажата "+КодКлавиши);
// вообще все блокируем
ФСО=0;
КонецПроцедуры

Открываем обработку, жмем Esc - все класс!, пишет, что нажата, не обрабатывает.
Жмем Сформировать, уходим в цикл. Жмем Ecs - получаем, что на картинке.
Насколько помню, ИМЕННО О ЦИКЛЕ вопрос стоял, а не ВООБЩЕ

Отмена редактирования данных в формах клавишей Esc

При работе с формами клавиша Esc используется в различных случаях для отмены редактирования данных.

Прежде всего, клавиша Esc используется для закрытия форм. Если в форме выполняется редактирование объекта (элемента справочника, документа и т.д.) или записи регистра сведений, то при закрытии формы, независимо от того, как вызвано закрытие, предлагается выполнить сохранение данных. Если в появившемся окне выбрать кнопку "Нет", то изменения данных не будут записаны в базу данных. Соответственно, все изменения, выполненные в форме после открытия или после последнего сохранения в форме, не будут отражены в базе данных.

Нажатие клавиши Esc в формах списков, отчетов, обработок так же закрывает окно, но в этих случаях при закрытии никаких действий по изменению данных не выполняется, соответственно, не выполняется и никакой отмены изменения данных.

Кроме того клавиша Esc используется для отмены редактирования строки табличного поля. Здесь следует учитывать, что если в строке табличного поля редактируется отдельный объект базы данных (например, элемент справочника) или запись регистра сведений, то при нажатии Esc отменяется редактирование и запись данных в базу данных не производится, соответственно, все изменения, выполненные в ходе редактирования строки, в базе данных отражены не будут. Если в табличном поле редактируется табличная часть объекта (документа, справочника и т.д.) или набор записей регистра, то при нажатии клавиши Esc будет закончено редактирование строки, но все изменения сделанные в строке не будут отменены, так как строки табличных частей и наборов записей не записываются в базу данных в процессе редактирования, а записываются вместе с объектом или набором записей. Соответственно, при нажатии Esc в этом случае может быть отменено только не полностью введенное значение.

Например, если в числовом поле в ячейке табличного поля набрать несколько цифр и нажать Esc , то будет отменно введенное изменение в этой ячейке, но не будут отменены изменения сделанные в других ячейках. Однако если в поле ввода в ячейке табличного поля выполнено целостное изменение значения, например, выполнен выбор из списка или очистка клавишей Shift + F 4, то это изменение не будет отменено клавишей Esc . Кроме того, в табличных частях и наборах записей клавишей Esc отменяется ввод новой строки.

При редактировании значений в ячейках табличного документа отмена редактирования ячейки действует так же, как и при редактировании табличных частей в табличном поле. Клавиша Esc отменяет изменения сделанные путем ввода отдельных символов, но не отменяет целостные изменения значения ячейки, выполненные вызовом калькулятора, календаря, выбора из списка, очистки клавишей Shift + F 4.


Добрый день.
Приложение построено на основе главного окна vfp. Все формы in-screen.
Хочу сделать закрытие внутренних форм по клавише ESC.
Половина получилось:

Все работает если фокус стоит на каком - нибудь элементе формы (Textbox, Button, Grid . ). А вот если ни один из элементов не активен, то нажатия клавиш не перехватываются.
Подскажите, пожалуйста, как можно решить эту проблему.
Спасибо

Повесить кнопку и выставить ей Cancel=.T.


------------------
Часто бывает так, что есть над чем задуматься, а нечем. Блин. проверила на пустой форме - все работает. Наверное проблема совсем не так выглядит, как я ее описала. Наверное все портит ActiveX - ctTree, который расположен у меня на форме. Если он активен, то я не могу перехватить нажатие клавиш.

В ActiveX надо писать дополнительную обработку кнопок, он сам по себе "малчьик" и плевать он хотел на фокс


------------------
Часто бывает так, что есть над чем задуматься, а нечем. Honey
Блин. проверила на пустой форме - все работает. Наверное проблема совсем не так выглядит, как я ее описала. Наверное все портит ActiveX - ctTree, который расположен у меня на форме. Если он активен, то я не могу перехватить нажатие клавиш.

В общем случае, правильно. Внутри ActiveX (когда на них фокус) свои собственные ASCII-коды клавишь. Как правило, отличные от внутренних кодов FoxPro. Поэтому часто приходится писать "дубль" в событиях вроде KeyDown или KeyUp ActiveX элементов.

Однако для клавиши Esc внутри объекта Microsoft TreeView я такой проблемы не обнаружил. Нормально "нажимается" кнопка CommandButton со свойством Cancel=.T. Или речь идет о другом ActiveX?

Владимир Максимов
Речь идет об ActiveX "ctTree". Попробую сама немного повозиться с ним. Напишу о результате.
Спасибо

В методе KeyUp объекта TreeView

*** ActiveX Control Event ***
LPARAMETERS keycode, SHIFT
DO CASE
CASE keycode = 27 && Esc
THISFORM.KEYPRESS(27) && или сразу thisform.Release
ENDCASE

anelsasha
В методе KeyUp объекта TreeView
.

Для закрытия формы такое еще можно сделать, но, в общем случае, нельзя "подвешивать" (оставлять не завершенными) методы или события ActiveX компонент, поскольку это может привести к разнообразным глюкам.

Например, если из метода ActiveX вызвать модальную форму, также содержащую ActiveX, то есть большая вероятность того, что в дочерней форме ActiveX просто не будет работать. Именно по той причине, что остался "подвешенным" (не завершенным) метод ActiveX в родительской форме.

Проблема решается либо через прямое присвоение кода клавиши через команду KEYBOARD, либо через одноразовые таймеры. Т.е. сначала целиком и полностью завершается метод ActiveX, а затем срабатывает "отложенное" событие, выполняющее нужную обоработку.

Читайте также: