Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Плавающая форма (число прочтений - 2779 )
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 235
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Плавающая форма
19. Февраля 2019 :: 18:01
Печать  
Кто-нибудь обратил внимание, что при закрытии Плавающей формы контекст этой формы остается доступным? И чтобы обнулить его приходится присваивать пустое значение (0 или ""). Конфигурация, где активно используется эта связка стала мёртво зависать. Хотелось бы спросить у Альфа, может ли частое открытие-закрытие одной той же плавающей формы вызвать зависание программ 1с? Или всё же (очень надеюсь) причина где-то в чём-то другом?
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1532
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Плавающая форма
Ответ #1 - 20. Февраля 2019 :: 07:31
Печать  
Плавающие формы я вообще не рекомендую использовать.
  

FormEx developer
Наверх
www  
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 235
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: Плавающая форма
Ответ #2 - 20. Февраля 2019 :: 14:42
Печать  
АЛьФ писал(а) 20. Февраля 2019 :: 07:31:
Плавающие формы я вообще не рекомендую использовать.


Жаль, при работе с графикой незаменима. Плачущий
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 571
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Плавающая форма
Ответ #3 - 20. Февраля 2019 :: 15:55
Печать  
recop писал(а) 19. Февраля 2019 :: 18:01:
Кто-нибудь обратил внимание, что при закрытии Плавающей формы контекст этой формы остается доступным? И чтобы обнулить его приходится присваивать пустое значение (0 или ""). Конфигурация, где активно используется эта связка стала мёртво зависать. Хотелось бы спросить у Альфа, может ли частое открытие-закрытие одной той же плавающей формы вызвать зависание программ 1с? Или всё же (очень надеюсь) причина где-то в чём-то другом?


Эээээ.... гугл же есть Подмигивание
Набери "1с++ Плавающая форма"
Первая ссылка: http://www.1cpp.ru/forum/YaBB.pl?num=1236948530/4

10 лет назад уже заметили. Но лишнего времени с каждым годом ставится все меньше и меньше...

Может попробуешь не закрывать, а как то прятать или сдвигать далеко вправо/вниз?
  
Наверх
www  
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 235
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: Плавающая форма
Ответ #4 - 20. Февраля 2019 :: 17:03
Печать  
Djelf писал(а) 20. Февраля 2019 :: 15:55:
10 лет назад уже заметили. Но лишнего времени с каждым годом ставится все меньше и меньше...

Может попробуешь не закрывать, а как то прятать или сдвигать далеко вправо/вниз?


10 лет назад я и не подозревал, что в 1с можно рассчитывать и рисовать проекты, да и надобности такой не было. А то, что баг плавающей формы держится уже 10 лет это нонсенс, и он говорит о том, что разработчик не нашел ей достойное применение. Жаль. Это самый мощный инструмент в пакете formex, который даже в созданном варианте (судя по возникающим вопросам на данном форуме) находит широкое применение. Так какие же преимущества имеет данная разработка кроме основного супер преимущества, позволяющая программно обрабатывать две и более форм как единое целое:
Приложения с интерфейсом MDI очень специфический продукт имеющий массу недостатков, и это значительно ограничивает распространение этой технологии. Например, возьмем одну из них: максимизацию окон, что очень удобно для форм имеющих таблицу со множеством колонок, и совсем уродливо (особенно на современных мониторах) когда форма ввода, того же самого нового элемента справочника целиком перекрывает сам справочник. В этом случае технология предлагает модальные окна - отлично, но большинство предопределенных процедур в этом случае отказываются работать, сводя все достоинства formex практически на нет и вынуждает остаться наедине со скучным интерфейсом 1с.
Совсем недавно я обнаружил интересный баг, но пока не отловил момент его возникновения. После вызова из плавающего окна ему подобное и его закрытия в вызывающей форме включилась модальность и плавающее окно по сути стало модальным, но при этом все фичи библиотеки formex работали в штатном режиме. В итоге мы имеем модальное окно позволяющее без всяких ограничений использовать все виды предопределенных процедур.
Отказаться от использования данного инструмента я уже не в состоянии, поэтому буду искать решения которые позволят безопасно его использовать.

  
Наверх
 
IP записан
 
Arbuz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 39
Зарегистрирован: 06. Февраля 2019
Re: Плавающая форма
Ответ #5 - 21. Февраля 2019 :: 12:07
Печать  
recop писал(а) 20. Февраля 2019 :: 17:03:


Круто! А в работе как? Не дёргается, не глючит? Графика на jave через acivex ie или ещё как? Вообще очень интересно какие технологии в проекте используются.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 807
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Плавающая форма
Ответ #6 - 21. Февраля 2019 :: 13:19
Печать  
Реквизиты формы заменял на какой-то свой ActiveX?
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 235
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: Плавающая форма
Ответ #7 - 21. Февраля 2019 :: 19:06
Печать  
Arbuz писал(а) 21. Февраля 2019 :: 12:07:
...Не дёргается, не глючит? Графика на jave через acivex ie или ещё как? Вообще очень интересно какие технологии в проекте используются.


Плавно тащишь - не дёргается. Глючит после ввода делителя, потому сейчас весь хлам упорядочивается и заворачивается в классы. 1С++, FormEx и GflAx.dll+SemenPic.ocx. См. класс http://www.1cpp.ru/forum/YaBB.pl?num=1519812923.

alyuev писал(а) 21. Февраля 2019 :: 13:19:
Реквизиты формы заменял на какой-то свой ActiveX?


Штатные. РеквизитДиалога.РасширенныйСтиль=0 + штатная картинка, обрабатывается в предопределенных процедурах. Но считаю данный подход не верным в данный момент в очереди для обертки в класс (Глобальник перегружен).
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 807
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Плавающая форма
Ответ #8 - 21. Февраля 2019 :: 23:29
Печать  
recop писал(а) 21. Февраля 2019 :: 19:06:
Штатные. РеквизитДиалога.РасширенныйСтиль=0


А цвет реквизита как так сделал - полную заливку одни цветом? В частности для агрегатов?
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 235
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: Плавающая форма
Ответ #9 - 22. Февраля 2019 :: 05:46
Печать  
alyuev писал(а) 21. Февраля 2019 :: 23:29:
А цвет реквизита как так сделал - полную заливку одни цветом? В частности для агрегатов?


FormEx: Атрибут.ЦветФона=хххх;

Ещё баг на плавающую:
    Сервис.АктивныйКонтекст(КонтФормы)
КонтФормы = контекст плавающей формы в независимости какое окно активно в данный момент.

Спецы по СИ помогите Альфу разобраться с плавающей формой, очень нужный инструмент.
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1532
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Плавающая форма
Ответ #10 - 22. Февраля 2019 :: 07:53
Печать  
Плавающая форма - это обычная модальная форма, у которой я попытался отключить модальность. Соответственно, это все не баги, а нормальное поведение 1С по работе с модальной формой. Ведь 1С именно так ее и воспринимает. Чтобы нормально реализовать идею плавающей формы, надо полностью переработать этот механизм и реализовать собственный класс окна, который будет нормально работать с формами 1С. Объем работы огромный с неизвестным результатом.
Если кто-то возьмется это все сделать - флаг в руки.
  

FormEx developer
Наверх
www  
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 235
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: Плавающая форма
Ответ #11 - 22. Февраля 2019 :: 10:21
Печать  
АЛьФ писал(а) 22. Февраля 2019 :: 07:53:
Плавающая форма - это обычная модальная форма, у которой я попытался отключить модальность. Соответственно, это все не баги, а нормальное поведение 1С по работе с модальной формой. Ведь 1С именно так ее и воспринимает. Чтобы нормально реализовать идею плавающей формы, надо полностью переработать этот механизм и реализовать собственный класс окна, который будет нормально работать с формами 1С. Объем работы огромный с неизвестным результатом.
Если кто-то возьмется это все сделать - флаг в руки.


Зачёт. Попытка удалась. В модальном окне не работают предопределенные процедуры, в плавающем окне работают. Это я к чему? Да к тому, что получается  возможность, всё-таки, есть заставить модальные (псевдомодальные) окна генерировать события для предопределенных процедур. Возможно ли, не углубляясь в серьёзные изменения кода, у плавающего окна дополнительно предусмотреть включение модальности?
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 807
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Плавающая форма
Ответ #12 - 22. Февраля 2019 :: 15:40
Печать  
Атрибут.ЦветФона для реквизита агрегатного типа, например, на твой форме, как я понимаю, это "Регион" - раскрашивает в оригинале только окантовку, т.к. в центре реквизита прямоугольник в цвет формы. А в твоем случае реквизит раскрашен полностью. Вот я и спрашиваю, как у тебя так получилось?
Или в твоем случае "Регион" это текстовое поле с кнопкой выбора?
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
recop
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 235
Местоположение: Калуга
Зарегистрирован: 06. Июня 2017
Пол: Мужской
Re: Плавающая форма
Ответ #13 - 22. Февраля 2019 :: 19:29
Печать  
alyuev писал(а) 22. Февраля 2019 :: 15:40:
Атрибут.ЦветФона для реквизита агрегатного типа, например, на твой форме, как я понимаю, это "Регион" - раскрашивает в оригинале только окантовку, т.к. в центре реквизита прямоугольник в цвет формы. А в твоем случае реквизит раскрашен полностью. Вот я и спрашиваю, как у тебя так получилось?
Или в твоем случае "Регион" это текстовое поле с кнопкой выбора?


Реквизит диалога без кнопки выбора и рядом динамически сформированная картинка. Картинка формируется динамически.

Код
Выбрать все
//+++-recop---18.02.16------------------------------------ оComboBox, oComboChoice
function оCombo_Создать(Конт,оОбъекты,Атрибут,Слой)
	var ОсновнойАтрибут,Система,Префикс,Атр,Индекс,Имя,Длина,i;
	var X,Y,W,H;

	Try // если нет основного атрибута ничего не делаем
		ОсновнойАтрибут = Конт.РасшФормы.ПолучитьАтрибут(Сред(Атрибут.Идентификатор,6));
	Except
	EndTry;

	Система = СоздатьОбъект("Система");
	Префикс = Лев(Атрибут.Идентификатор,5);


	// переустанавливаем размеры
	Атрибут.ПолучитьКоординаты(X,Y,W,H);
	Атрибут.УстановитьКоординаты(,,W-19,20);
	Атрибут.РасширенныйСтиль=0;

	// устанавливаем и инициализируем кнопку
	Атр = Конт.РасшФормы.ДобавитьАтрибут(Атрибут.Идентификатор+"#",10);
	Атр.Стиль = 1476558859;
	Атр.Слой = Атрибут.Слой;
	Индекс = ?(ПустоеЗначение(ОсновнойАтрибут)=1,1,ОсновнойАтрибут.Доступность);

	Атр.Значение.РежимРисования(2);
	Атр.УстановитьКоординаты(X+W-20,Y,20,20);
	Атр.Видимость = Слой.НайтиЗначение(Атр.Слой);

	РегистрацияОбъекта(Атр,оОбъекты,5);

	// попытаемся присвоить атрибуту значение корневого атрибута (если существует)
	if ПустоеЗначение(ОсновнойАтрибут) = 0 then

		if ТипЗначения(Атрибут.Значение) = 0 then // неопределенный тип

			Длина = 0;
			if ТипЗначенияСтр(ОсновнойАтрибут.Значение) = "Справочник" then
				ОсновноеПредставление = Метаданные.Справочник(ОсновнойАтрибут.Значение.Вид()).ОсновноеПредставление;
				if ОсновноеПредставление = "ВВидеНаименования" then
					Длина = Метаданные.Справочник(ОсновнойАтрибут.Значение.Вид()).ДлинаНаименования;
				else
					Длина = Метаданные.Справочник(ОсновнойАтрибут.Значение.Вид()).ДлинаКода;
				endif;
				Конт.Форма.ПолучитьАтрибут(Атрибут.Идентификатор).НазначитьТип("Строка",Длина);
				Атрибут.Значение=Строка(ОсновнойАтрибут.Значение);

			elsif ТипЗначенияСтр(ОсновнойАтрибут.Значение) = "Перечисление" then
				for i = 1 to ) do
					Длина = ).Представление),Длина);
				enddo;
				Конт.Форма.ПолучитьАтрибут(Атрибут.Идентификатор).НазначитьТип("Строка",Длина);
				Атрибут.Значение=Строка(ОсновнойАтрибут.Значение);

			elsif ТипЗначенияСтр(ОсновнойАтрибут.Значение) = "СписокЗначений" then
				for i = 1 to ОсновнойАтрибут.Значение.РазмерСписка() do
					Значение = ОсновнойАтрибут.Значение.ПолучитьЗначение(i,Имя);
					Длина = Макс(СтрДлина(Строка(?(ПустоеЗначение(Имя)=0,Имя,Строка(Значение)))),Длина);
				enddo;
				Конт.Форма.ПолучитьАтрибут(Атрибут.Идентификатор).НазначитьТип("Строка",Длина);

			elsif ТипЗначенияСтр(ОсновнойАтрибут.Значение) = "Строка" then
				Длина = СтрДлина(ОсновнойАтрибут.Значение);
				Конт.Форма.ПолучитьАтрибут(Атрибут.Идентификатор).НазначитьТип("Строка",Длина);
			endif;

		endif;

		Конт.Форма.Обновить();
	endif;

endfunction // оCombo_Создать()
 




Красим обязательные поля:

Атрибут = РасшФормы.ПолучитьАтрибут(Х);
if Атрибут.Тип = 2 then
  Атрибут.РасширенныйСтиль=0;
  Атрибут.ЦветФона = 16775149;
endif;
            
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 807
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Плавающая форма
Ответ #14 - 22. Февраля 2019 :: 19:40
Печать  
А! Ну, вот я же и говорю, что у тебя это текстовое поле! Реквизит меняет свой тип.

Цитата:
Конт.Форма.ПолучитьАтрибут(Атрибут.Идентификатор).НазначитьТип("Строка",Длина);


Тогда всё понятно с цветом.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать