Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Бесконечный цикл при SendKeys (?) (число прочтений - 6709 )
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Бесконечный цикл при SendKeys (?)
18. Мая 2009 :: 10:05
Печать  
Сделал в своей конфе допонительные клавиши для работы с реквизитами на форме.
В глобальном модуле
Код
Выбрать все
Процедура ПриНажатииКнопкиКлавиатуры ( конт, код, _а, _ш, _к, Символ, ФСО ) // предопределенная процедура компоненты FormEx
	//Сообщить("Нажата кнопка клавиатуры. "+код+" "+_а+" "+_ш+" "+_к);
	Если код = 32 Тогда // клавиша пробел - открыть форму справочника, документа,
		Попытка
			Атрибут = СоздатьОбъект("АтрибутФормы");
			Атрибут.УстановитьАтрибут(конт.Форма, конт.Форма.АктивныйЭлемент());
		Исключение
			Возврат; // нет активной формы, или любая другая ошибка
		КонецПопытки;
		ТипАтрибута = ТипЗначения(Атрибут.Значение);

		Если (ТипАтрибута = 11) Или (ТипАтрибута = 12) Тогда //реквизит типа справочник, документ
			ФСО = 0;
			глОткрытьФорму(Атрибут.Значение, конт, 1 - _к);
		КонецЕсли;
	ИначеЕсли код = 46 Тогда // Delete key - очистить поле
		Сервис.SendKeys ( "+{F4}" ); // SHIFT+F4 - очистить поле; на любом типе реквизита ничего страшного не будет от того, что будет нажато SHIFT+F4
	ИначеЕсли Код = 45 Тогда // Insert - выбрать значение
		Сервис.SendKeys( "{F4}" ); // Insert -> F4 - выбор, на любом типе реквизита ничего страшного не будет от того, что будет нажато F4
... 


Чтобы открыть элемент справочника или документ - нажать пробел на на соответствующем реквизите формы.
Чтобы очистить значение - нажать Delete. Чтобы выбрать значение - Insert.
Все это уже давно работает, но достает один глюк (ли?). Иногда при нажитии Delete или Insert 1c "подвисает". По признакам - бесконечный цикл, связанный с обработкой нажатиий клавиш?
Есть идеи?
Спасибо.
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Бесконечный цикл при SendKeys (?)
Ответ #1 - 18. Мая 2009 :: 10:09
Печать  
Если сталю брейк пойнт на этой процедуре - все кончается.
Если в этот момент редактирую модуль в конфигураторе и нажимаю контрол - текущее окно закрывается, как будто нажата и Ф4.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Бесконечный цикл при SendKeys (?)
Ответ #2 - 18. Мая 2009 :: 10:12
Печать  
Мот того, делать всё в ПриОтжатииКнопкиКлавиатуры ?
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Бесконечный цикл при SendKeys (?)
Ответ #3 - 18. Мая 2009 :: 10:13
Печать  
Eprst писал(а) 18. Мая 2009 :: 10:12:
Мот того, делать всё в ПриОтжатииКнопкиКлавиатуры ?

В доке об этой предопределенной процедуре ничего нет. Щас попробую.
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Бесконечный цикл при SendKeys (?)
Ответ #4 - 18. Мая 2009 :: 10:22
Печать  
То же самое. Система жестко виснет. 1с жрет 30% процессорного времени. Explorer - 30% и Пунто  Свитчер тоже немного. По-видимому, при вызове SendKeys снова срабатывает ПриНажатии...
Как быть? (Ну хочу статить ФСО = 0 - Delete могут нажать и на текстовом поле, не хочется проверять тип реквизита. Хотя если выбора нет - придется)

"Зависание" происходит редко, но все же... Может ФормЕкс стоит ставить следующий вызов процедуры ПриНажатии в очередь если она в данный момент выполняется?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Бесконечный цикл при SendKeys (?)
Ответ #5 - 18. Мая 2009 :: 10:55
Печать  
Иди в поиск по "ЗащитаОтАльФа", в соответствующих ветках есть рецепты.
Вкратце - ты сам встраиваешь некую переменную как защиту от зацикливания - полный контроль все равно на тебе Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Бесконечный цикл при SendKeys (?)
Ответ #6 - 18. Мая 2009 :: 11:37
Печать  
Спасибо
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Бесконечный цикл при SendKeys (?)
Ответ #7 - 28. Мая 2009 :: 10:09
Печать  
Все равно зависает:
Код
Выбрать все
Процедура ПриНажатииКнопкиКлавиатуры ( конт, код, _а, _ш, _к, Символ, ФСО ) // предопределенная процедура компоненты FormEx
	Сообщить(гл_дв_ДатаВремя(,1) + " Нажата кнопка клавиатуры. "+код+" "+_а+" "+_ш+" "+_к + " ИдетОбработкаНажатияКнопки = " + ИдетОбработкаНажатияКнопки);
	Если ИдетОбработкаНажатияКнопки = 1 Тогда ФСО = 0; Возврат; КонецЕсли;
	ИдетОбработкаНажатияКнопки = 1;
	Попытка
		Если код = 32 Тогда // клавиша пробел - открыть форму справочника, документа,
			Атрибут = СоздатьОбъект ( "АтрибутФормы" );
			Атрибут.УстановитьАтрибут ( конт.Форма, конт.Форма.АктивныйЭлемент () );
			ТипАтрибута = ТипЗначения ( Атрибут.Значение );

			Если ( ТипАтрибута = 11 ) Или ( ТипАтрибута = 12 ) Тогда //реквизит типа справочник, документ
				ФСО = 0;
				глОткрытьФорму ( Атрибут.Значение, конт, 1 - _к );
			КонецЕсли;
		ИначеЕсли код = 46 Тогда // Delete key - очистить поле
			Сервис.SendKeys ( "+{F4}" ); // SHIFT+F4 - очистить поле; на любом типе реквизита ничего страшного не будет от того, что будет нажато SHIFT+F4
		ИначеЕсли Код = 45 Тогда // Insert - выбрать значение
			Сервис.SendKeys ( "{F4}" ); // Insert -> F4 - выбор, на любом типе реквизита ничего страшного не будет от того, что будет нажато F4
			Сообщить("Послали нажатие F4");
		КонецЕсли;
	Исключение; // нет активной формы, или любая другая ошибка
	КонецПопытки;
	ИдетОбработкаНажатияКнопки = 0;
КонецПроцедуры
 


Если открыть какой-нибудь справочник и нажимать много раз Insert - зависает со следующим результатом в окне сообщений:
Цитата:
2009-05-28 12:59:34 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки =
Послали нажатие F4
2009-05-28 12:59:34 Нажата кнопка клавиатуры. 115 0 0 0 ИдетОбработкаНажатияКнопки = 0
2009-05-28 12:59:34 Нажата кнопка клавиатуры. 115 0 0 0 ИдетОбработкаНажатияКнопки = 0
2009-05-28 12:59:34 Нажата кнопка клавиатуры. 115 0 0 0 ИдетОбработкаНажатияКнопки = 0
2009-05-28 12:59:34 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки = 0
Послали нажатие F4
2009-05-28 12:59:35 Нажата кнопка клавиатуры. 115 0 0 0 ИдетОбработкаНажатияКнопки = 0
2009-05-28 12:59:35 Нажата кнопка клавиатуры. 115 0 0 0 ИдетОбработкаНажатияКнопки = 0
2009-05-28 12:59:35 Нажата кнопка клавиатуры. 115 0 0 0 ИдетОбработкаНажатияКнопки = 0
2009-05-28 12:59:35 Нажата кнопка клавиатуры. 115 0 0 0 ИдетОбработкаНажатияКнопки = 0
2009-05-28 12:59:35 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки = 0
Послали нажатие F4
2009-05-28 12:59:35 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки = 0
Послали нажатие F4
2009-05-28 12:59:35 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки = 0
Послали нажатие F4
2009-05-28 12:59:35 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки = 0
Послали нажатие F4
2009-05-28 12:59:35 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки = 0
Послали нажатие F4
2009-05-28 12:59:36 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки = 0
Послали нажатие F4
2009-05-28 12:59:36 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки = 0
Послали нажатие F4
2009-05-28 12:59:36 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки = 0
Послали нажатие F4
2009-05-28 12:59:36 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки = 0
Послали нажатие F4
2009-05-28 12:59:36 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки = 0
Послали нажатие F4
2009-05-28 12:59:36 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки = 0
Послали нажатие F4
2009-05-28 12:59:36 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки = 0
Послали нажатие F4
2009-05-28 12:59:36 Нажата кнопка клавиатуры. 45 0 0 0 ИдетОбработкаНажатияКнопки = 0

Что происходит - не пойму. Одно ясно - это не рекурсия.
  
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Бесконечный цикл при SendKeys (?)
Ответ #8 - 29. Мая 2009 :: 04:41
Печать  
Я, конечно, не проверял, но -- ты уверен, что нужно обнулять ФСО здесь? :
Код
Выбрать все
Процедура ПриНажатииКнопкиКлавиатуры ( конт, код, _а, _ш, _к, Символ, ФСО )
...
	Если ИдетОбработкаНажатияКнопки = 1 Тогда ФСО = 0; Возврат; КонецЕсли; 

  
Наверх
ICQ  
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Бесконечный цикл при SendKeys (?)
Ответ #9 - 29. Мая 2009 :: 06:16
Печать  
да я отсюда код стащил.
http://www.1cpp.ru/forum/YaBB.pl?num=1175243307/41#41
попытаюсь убрать.

UPDATE:
ФСО = 0 убрал - не помогает
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Бесконечный цикл при SendKeys (?)
Ответ #10 - 29. Мая 2009 :: 07:04
Печать  
ФСО = 0 ; воткни во все ветки условия, где события клавишь отрабатываешь... попробуй.
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Бесконечный цикл при SendKeys (?)
Ответ #11 - 29. Мая 2009 :: 07:20
Печать  
Пожалуй, это поможет, но нарушит логику программы.
Сервис.SendKeys ( "+{F4}" ); - Delete может быть нажата на текстовом поле, поэтому мне не надо отменять его нажатие, а просто вдогонку послать Shift+F4. Заморачиваться с проверкой текущего реквизита тоже не хочется.
Я не ищу в данном случае workaround. По идее, это решение должно работать. Но не работает.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Бесконечный цикл при SendKeys (?)
Ответ #12 - 29. Мая 2009 :: 07:37
Печать  
А вот не пофиг ли ? Тупо зделаешь АтрФ.Значение=""; например..
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Бесконечный цикл при SendKeys (?)
Ответ #13 - 29. Мая 2009 :: 07:53
Печать  
Я хочу чтобы еще и формула сработала. И чтобы не проверять если текущий атрибут формы только для чтения.

Хочу понять, в чем проблема. Если это глюк Формекс, тогда лучше его найти и исправить, иначе кто-то другой наткнется, может быть и в другом виде.
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: Бесконечный цикл при SendKeys (?)
Ответ #14 - 30. Мая 2009 :: 10:24
Печать  
Блин, и так и сяк кручусь. Методом тыка пробую - не получается. Мне все-таки кажется, что это глюк SendKeys:
Цитата:
Послали нажатие F4
2009-05-28 12:59:34 Нажата кнопка клавиатуры. 115 0 0 0 ИдетОбработкаНажатияКнопки = 0
2009-05-28 12:59:34 Нажата кнопка клавиатуры. 115 0 0 0 ИдетОбработкаНажатияКнопки = 0

SendKeys посылает одно нажатие F4, а перехватывается 2, 3 раза и больше.

Если делать
Код
Выбрать все
Сервис.SendKeys ( "{F4}", 1 ) 


зависания нет, но Ф4 (выбор) не срабатывает, хотя событие ее нажатия перехватывается и ФСО = 1

Альф, помоги...

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать