Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Проблема: ПриНажатииЛевойКнопки в ГМ (число прочтений - 6334 )
gavlexx
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 7
Зарегистрирован: 06. Мая 2007
Проблема: ПриНажатииЛевойКнопки в ГМ
03. Июля 2007 :: 17:11
Печать  
Описание ошибки:
1) Прописываем в ГМ процедуру "ПриНажатииЛевойКнопки".
2) Открываем какую-то форму (например, журнал документов)
3) Вызываем диалог выбора интервала этого журнала и помещаем эту форму поверх формы самого журнала.
4) Теперь щелчок левой кнопкой мыши на форме выбора интервала вернет контекст формы "под ним", т.е. самого журнала (или любой другой, оказавшейся под ним).

В результате становится невозможным отлов реквизита любой формы, на котором щелкнули мышью.

Та же проблема с другими окнами, например, вызываемым через меню "Сервис-Параметры", и прочих, не имеющих в конфигурации своих форм. Если только они перекрывают формы объектов конфигурации, то "ПриНажатииЛевойКнопки" вернет контекст этой "подложки"...

Как быть?  Озадачен
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема: ПриНажатииЛевойКнопки в ГМ
Ответ #1 - 03. Июля 2007 :: 17:34
Печать  
Ничего не понял! Печаль
Если судить по первым абзацам, то возвращается контекст формы журнала, и это вроде верно.
А по последним абзацам непонятно, о чем говоришь, о какой подложке Печаль
Уточни.
  

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


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Проблема: ПриНажатииЛевойКнопки в ГМ
Ответ #2 - 03. Июля 2007 :: 18:53
Печать  
gavlexx писал(а) 03. Июля 2007 :: 17:11:
В результате становится невозможным отлов реквизита любой формы, на котором щелкнули мышью.


1. а что ты хочешь отловить на закладке Сервис - Параметры
- может лучше Цитата:
"V7AppProfile - внешняя компонента для настройки параметров системы 1С:Предприятие 7.7"


2. А что с интервалом журнала
Код
Выбрать все
Синтаксис:
ПриУстановкеИнтервала(<ДатаНач>,<ДатаКон>) 



3. Ну и в принципе поправьте меня - ведь указанные сервисные формы, жестко зашиты в движок 1С, и вроде Контекстами активных форм не являются
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема: ПриНажатииЛевойКнопки в ГМ
Ответ #3 - 04. Июля 2007 :: 04:25
Печать  
lustin писал(а) 03. Июля 2007 :: 18:53:
3. Ну и в принципе поправьте меня - ведь указанные сервисные формы, жестко зашиты в движок 1С, и вроде Контекстами активных форм не являются

+1

Да, к встроенным сервисным формам 1С через Контекст не обратишься.

Автор, что хочешь-то? к каким формам/атрибутам нужен доступ и для чего?
  

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


I Love YaBB 2!

Сообщений: 7
Зарегистрирован: 06. Мая 2007
Re: Проблема: ПриНажатииЛевойКнопки в ГМ
Ответ #4 - 04. Июля 2007 :: 08:50
Печать  
Сорри за сбивчивое описание...  Улыбка
Объясню так:
нет, я не пытаюсь получать доступ к реквизитам "вшитых" в 1С форм. Просто если такая "вшитая" форма перекрывает форму конфигурации, то при работе в этом диалоге (выборе интервала журнала или настройке параметров) в "ПриНажатииЛевойКнопки()" в ГМ передается контекст формы "под ней". Т.е. я не могу различить, щелкнули на самой форме конфигурации или в диалоге.

Чтобы проверить это, достаточно сделать следующее:
1) поместите в ГМ "ПриНажатииЛевойКнопки()"
2) откройте форму журнала документов
3) вызовите диалог выбора интервала
4) переместите окно диалога так, чтобы оно перекрывало форму журнала
5) щелкайте в диалоге (выбирайте даты) и посмотрите, что передается в переменной "Контекст" в процедуру "ПриНажатииЛевойКнопки()"

В переменной передается контекст формы под диалогом, а правильно было бы ничего не передавать.
  
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Проблема: ПриНажатииЛевойКнопки в ГМ
Ответ #5 - 04. Июля 2007 :: 09:25
Печать  
Есть такая проблема. Причем не только ПриНажатииЛевойКнопки и не только в ГМ, а и в локальном контексте.
Системные модальные окошки прозрачны для обработчиков мышиных событий FormEx.
  
Наверх
ICQ  
IP записан
 
gavlexx
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 7
Зарегистрирован: 06. Мая 2007
Re: Проблема: ПриНажатииЛевойКнопки в ГМ
Ответ #6 - 04. Июля 2007 :: 09:38
Печать  
vip писал(а) 04. Июля 2007 :: 09:25:
Есть такая проблема. Причем не только ПриНажатииЛевойКнопки и не только в ГМ, а и в локальном контексте.
Системные модальные окошки прозрачны для обработчиков мышиных событий FormEx.


Т.е. даже если переделать на локальные процедуры "ПриНажатииЛевойКнопки()", все равно будет срабатывать форма под диалогом?

Как тогда быть? Может есть какие другие обходные пути решения? Озадачен
  
Наверх
 
IP записан
 
gavlexx
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 7
Зарегистрирован: 06. Мая 2007
Re: Проблема: ПриНажатииЛевойКнопки в ГМ
Ответ #7 - 04. Июля 2007 :: 09:55
Печать  
Задача стоит такая:

Есть файл с правами доступа всех пользователей ко всем реквизитам форм конфигурации.
Нужно узнать, на чем щелкнул пользователь (какой реквизит, какой формы), проверить есть ли у него право использовать этот реквизит (кнопку, реквизит диалога, многострочную часть, ...) и в зависимости от этого разрешить/запретить действие. Типа УстДоступность(), только без встраивания кода в модули конфигурации.
  
Наверх
 
IP записан
 
vip
1c++ power user
Отсутствует



Сообщений: 1570
Зарегистрирован: 19. Мая 2006
Re: Проблема: ПриНажатииЛевойКнопки в ГМ
Ответ #8 - 04. Июля 2007 :: 09:55
Печать  
Цитата:
Т.е. даже если переделать на локальные процедуры "ПриНажатииЛевойКнопки()", все равно будет срабатывать форма под диалогом?

Будет.
Цитата:
Как тогда быть? Может есть какие другие обходные пути решения?

Есть. Обратиться к АЛьФу.
  
Наверх
ICQ  
IP записан
 
gavlexx
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 7
Зарегистрирован: 06. Мая 2007
Re: Проблема: ПриНажатииЛевойКнопки в ГМ
Ответ #9 - 14. Июля 2007 :: 06:46
Печать  
Нашел обходной путь решения проблемы!  Подмигивание

Код
Выбрать все
//===================================
// Возвращает дескриптор (handle) активного окна
Функция ПолучитьХэндлАктивногоОкна()

	// получение дескриптора активного окна с точки зрения Windows
	// требует выполнения скрипта VBScript
	Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
	Скрипт.Language = "vbscript";
	ТекстСкрипта = "
		|Function GetForegroundWindow()
		|	Set Wrap = CreateObject(""DynamicWrapper"")
		|	Wrap.Register ""USER32.DLL"", ""GetForegroundWindow"", ""f=s"", ""r=l""
		|	hwnd = Wrap.GetForegroundWindow()
		|	GetForegroundWindow = hwnd
		|End Function
		|";
	Скрипт.AddCode("" + ТекстСкрипта);
	ХэндлАктивногоОкна = Скрипт.Run("GetForegroundWindow");
	Скрипт = "";

	Возврат ХэндлАктивногоОкна;

КонецФункции	// ПолучитьХэндлАктивногоОкна

// ЗДЕСЬ решена проблема "прозрачных" для FormEx кнопках
Процедура ПриНажатииЛевойКнопки(Конт, СостояниеКнопокМыши, КоординатаПоГоризонтали, КоординатаПоВертикали ,ФлагСтандартнойОбработки)

	// если щелчок не на открытой форме (FormEx не вернул контекст)
	Если ТипЗначения(Конт)<>100 Тогда
		СообщитьОтладИнфо(СобытиеСтр, ОтладИнфоСтр);
		Возврат;
	КонецЕсли;

	// модальные диалоговые окна "прозрачны" для FormEx
	// (типа "Сервис -> Настройка параметров", "Выбор интервала журнала")
	// если диалог перекрывает форму в точке щелчка, то FormEx возвращает контекст формы под диалогом
	// для обработки таких ситуаций обратимся к WinAPI и будем использовать флаг
	фЩелчокНаПрозрачномДляFormExДиалоге = 0;

	// дескриптор окна, на котором с точки зрения WinAPI сделали щелчок
	ДескрипторАктивногоОкна = ПолучитьХэндлАктивногоОкна();
	// если это модальный диалог, "прозрачный" для FormEx, то WinAPI вернет его дескриптор
	// иначе WinAPI вернет дескриптор главного окна 1С:Предприятие
	Если ДескрипторАктивногоОкна<>ДескрипторОкна1СПредприятие Тогда
		фЩелчокНаПрозрачномДляFormExДиалоге = 1;
	КонецЕсли;

	// если щелчок на "прозрачном" для FormEx диалоге, то щелчок обрабатывается системой
	Если фЩелчокНаПрозрачномДляFormExДиалоге=1 Тогда
		Возврат;
	КонецЕсли;

	// <здесь ваш код, обрабатывающий нажатие левой кнопки мыши>

КонецПроцедуры
 



Метод основан на том, что все диалоговые окна, прозрачные для FormEx, рисуются 1С не в своей ветке подчиненности, а в ветке Десктопа (проверено Windows Spy)  Улыбка

Кстати, может кто-то объяснить, как получить через WinAPI MDIClient окна 1С и его активное окно? Кроме того, почему при попытке получить заголовок окна 1С через SendMessage(hwnd, WM_GETTEXT , 100, Title), скрипт всегда вылетает?  Озадачен
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема: ПриНажатииЛевойКнопки в ГМ
Ответ #10 - 14. Июля 2007 :: 08:31
Печать  
А дескриптор можно получить и через формекс...
  
Наверх
 
IP записан
 
gavlexx
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 7
Зарегистрирован: 06. Мая 2007
Re: Проблема: ПриНажатииЛевойКнопки в ГМ
Ответ #11 - 14. Июля 2007 :: 14:34
Печать  
Arta писал(а) 14. Июля 2007 :: 08:31:
А дескриптор можно получить и через формекс...

Ну да, ну да... Дескриптор какого окна? Перехваченного! А как я уже сказал, при щелчке на диалоге, прозрачном для Формекс, он возвращает контекст формы, а не диалога!
  
Наверх
 
IP записан
 
novichek
Экс-Участник


Re: Проблема: ПриНажатииЛевойКнопки в ГМ
Ответ #12 - 25. Июля 2007 :: 05:55
Печать  
gavlexx писал(а) 04. Июля 2007 :: 09:55:
Задача стоит такая:

Есть файл с правами доступа всех пользователей ко всем реквизитам форм конфигурации.
Нужно узнать, на чем щелкнул пользователь (какой реквизит, какой формы), проверить есть ли у него право использовать этот реквизит (кнопку, реквизит диалога, многострочную часть, ...) и в зависимости от этого разрешить/запретить действие. Типа УстДоступность(), только без встраивания кода в модули конфигурации.

Хм, а как насчет возможности добраться до этого реквизиты с помощью клавиатуры (Tab, Enter)?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать