Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема ПриИзмененииРазмераОкна() (число прочтений - 1987 )
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 243
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
ПриИзмененииРазмераОкна()
30. Января 2018 :: 10:26
Печать  
Форма постоянно максимизирована  (ТипСобытия=2), процедура продолжает вызываться при каждом использовании из этой формы процедуры ОткрытьФорму(...).

Устал вводить кучу всяких переменных и отслеживать их состояние, чтобы избежать перерисовки плана.

Как я понимаю, процедура реагирует на событие открываемой формы.

На открытие модальной формы, как и положено, не срабатывает.

Может Альф знает как это победить?
  
Наверх
 
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 243
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: ПриИзмененииРазмераОкна()
Ответ #1 - 30. Января 2018 :: 10:58
Печать  
При переключении между развернутыми окнами ТипСобытия чередует 0 при потере фокуса, 2 при его получении. Никакой логики применять сие искусство можно лишь как триггер какого-то события с окном. Жаль...
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 630
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: ПриИзмененииРазмераОкна()
Ответ #2 - 30. Января 2018 :: 15:02
Печать  
А почему бы просто не проверить изменился ли размер формы?
Всего 4 переменных или один вектор на 4 координаты.
  
Наверх
www  
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 243
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: ПриИзмененииРазмераОкна()
Ответ #3 - 30. Января 2018 :: 15:05
Печать  
При открытии обычного окна два захода глобально, два - локально.
При открытии максимизированного окна четыре - глобально, три - локально.
Пробую идентифицировать открытие, пока не получается.
  
Наверх
 
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 243
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: ПриИзмененииРазмераОкна()
Ответ #4 - 30. Января 2018 :: 15:08
Печать  
Djelf писал(а) 30. Января 2018 :: 15:02:
А почему бы просто не проверить изменился ли размер формы?
Всего 4 переменных или один вектор на 4 координаты.


О... идея, пробую...
  
Наверх
 
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 243
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: ПриИзмененииРазмераОкна()
Ответ #5 - 30. Января 2018 :: 15:18
Печать  
Не получается. Размер формы тоже меняется.
  
Наверх
 
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 243
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: ПриИзмененииРазмераОкна()
Ответ #6 - 30. Января 2018 :: 15:26
Печать  
Даже просто при переключении максимизированных окон размеры возвращает изначальные. Получается, что при прорисовки окна создается изначальный формат прорисованный в конфигураторе, затем его максимизирует. Вывод: скорее всего придется использовать какие-то глобальные переменные используемые в функциях ПриОткрытии(), ПриАктивации(), ПриДеактивации(). Геморрой, короче...
  
Наверх
 
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 243
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: ПриИзмененииРазмераОкна()
Ответ #7 - 30. Января 2018 :: 20:24
Печать  
ПриИзмененииРазмераОкна() использую повсеместно, особо не замечая выявленных недостатков (поглощались быстродействием), пока не встала текущая задача, требующая значительного времени в исполнении (полный расчет всех параметров плана, оборудования, потерь и т.п.). Недостатки проявились в многократном пересчете данных, что провоцировало моргания, двукратные прорисовки в разных масштабах и т.д.
Короче, после поисков и экспериментов вопрос решен так:
Код
Выбрать все
var PlanW,PlanH,old_PlanW,old_PlanH;
var ЭтоОткрытие,ЭтоЗакрытие,СобытиеОкна;


--
procedure ПриАктивацииОкна()
	var Attrib;

	Attrib=СоздатьОбъект("АтрибутФормы");
	Attrib.setAttribute(Форма,"План");
	Attrib.GetCoordinates(PlanX,PlanY,PlanW,PlanH);

	ЭтоОткрытие=0;
	if (PlanW<>old_PlanW) or (PlanH<>old_PlanH) then
		ПерерисоватьПлан();
	endif;

endprocedure // ПриАктивацииОкна()

--
procedure ПриДеактивацииОкна()

	old_PlanW = PlanW;
	old_PlanH = PlanH;
	ЭтоОткрытие=1;

endprocedure // ПриДеактивацииОкна()

--
procedure ПриЗакрытии()
	...
	...
	ЭтоЗакрытие=1;
endprocedure // ПриЗакрытии()

--
procedure ПриИзмененииРазмераОкна(ТипСобытия,Ширина,Высота)
	var Attrib;

	if (ТипСобытия <> 0) and (ТипСобытия=СобытиеОкна) and (ИзменениеУзлов=0) then
		return;
	endif;

	if (ТипСобытия=1) or (ЭтоОткрытие=1) or (ЭтоЗакрытие=1) then
		return;
	endif;

	...
	...
	Attrib=СоздатьОбъект("АтрибутФормы");
	Attrib.setAttribute(Форма,"План");
	Attrib.GetCoordinates(PlanX,PlanY,PlanW,PlanH);
	РасшФормы.ОбработкаОжидания("ПерерисоватьПлан",3);
	СобытиеОкна=ТипСобытия;

endprocedure // ПриИзмененииРазмераОкна()

++

old_PlanW = 0; old_PlanH = 0;
ЭтоОткрытие=1; СобытиеОкна=0; ЭтоЗакрытие=0;

 



Вот такие танцы с бубном...
  
Наверх
 
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 243
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: ПриИзмененииРазмераОкна()
Ответ #8 - 31. Января 2018 :: 07:31
Печать  
Ещё прикол, через контекст формы не получается определить текущий размер атрибута на максимизированной форме. От оно как! Сколько работаю с семеркой больше всего времени приходится тратить на обход кривых изобретений горе-программистов из 1С. Самое ужасное из которых - размещение атрибутов на форме по придуманным ими правилам  Смех
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать