Имя: Пароль:
1C
1C 7.7
v7: Выполнение процедуры после открытия модальной формы
0 maestro-72
 
21.05.13
14:07
Всем привет. Какаято засада, бъюсь уже пол дня...
Суть дела. Хочется чтобы из документа по кнопке запускалась модальная форма, на форме метки в которые заносится информация от внешнего оборудования, после считывания показаний оператор нажимает кнопку принять и показания попадают в программу как параметр. Оборудование имеет время стабилизации показателей, соответственно оператор должен это все наблюдать, чтобы неправильные данные не занести в программу. Проблема в том что если вешать процедуру обработки показателей на метку в форме, то форма не показывается на экране до завершения опроса и соответственно весь процесс теряет свою наглядность. Смотрел обработку для примера:
//
//                          by Alexey Bazhitov aka avb
//                     Moscow,  April 2003
//                   mailto:[email protected]
//
//-----------------------------------------------------------------------------
var s,c,d,h;
var flClose;
//-----------------------------------------------------------------------------
function hueToRGB(hue)  
if hue<0 then hue=hue+240 elsif hue>240 then hue=hue-240 endif;
if hue<40 then return (240*hue+20)/40 endif;
if hue<120 then return 240 endif;
if hue<160 then return (240*(160-hue)+20)/40 endif;
return 0;
endFunction  
//-----------------------------------------------------------------------------
function getColor(hue)
r=round((hueToRGB(hue+80)*255+120)/240);
g=round((hueToRGB(hue)*255+120)/240);
b=round((hueToRGB(hue-80)*255+120)/240);
if r<0 then r=0 endif; if r>255 then r=255 endif;
if g<0 then g=0 endif; if g>255 then g=255 endif;
if b<0 then b=0 endif; if b>255 then b=255 endif;
return b*65536+g*256+r;
endFunction
//-----------------------------------------------------------------------------
function time()
 form.refresh();
   if _getPerformanceCounter()-c>200 then
     c=_getPerformanceCounter();
       s=?(d=1,right(s,1)+mid(s,1,strlen(s)-1),mid(s,2)+left(s,1));
   endif;  
 h=1+h;                              
 if h>240 then h=0 endif;
 form.time.color(getColor(h));
   return currentTime();
endFunction  
//-----------------------------------------------------------------------------  
procedure onOpen()
if form.parameter<>"modal" then
 openFormModal("Processing#","modal",filePath());
   returnStatus(0);
   return;
endif;                        
d=0;
s="    Делу - время, делу - время, делу - время, а потехе - час!       ";
c=_getPerformanceCounter();  
flClose=0;
form.close();
endProcedure    
//-----------------------------------------------------------------------------
procedure onClose()
 if flClose=0 then returnStatus(0) endif;
   flClose=1;
endProcedure

Но у меня не сработало, работает только если кнопку какую повесить на форму и нажать на нее тогда процесс запускается, а так ни в какую.

сейчас у меня такой код примерно:
Перем ТВ003;    
Перем РезВес;
Перем КолПопыток;  
Перем Вес;    
Перем Задержка;
Перем с;

Процедура Задержать(Задержка)
   СтрокаЗапроса = "ping -n 1 -w "+Формат(1000*Задержка, "Ч010.0") +" 127.255.255.255";
   WshShell = СоздатьОбъект("WScript.Shell");
   WshShell.Run(СтрокаЗапроса, 0, -1);
КонецПроцедуры

Процедура Выполнить()
   КолПопыток = 100;
   Попытка
       Форма.Параметр = Число(РезВес);
   Исключение
       Форма.Параметр = -1;
   КонецПопытки;
   Форма.Закрыть();    
КонецПроцедуры  

Процедура ПриОткрытии()  
   Вес = 0.01;
   КолПопыток = 0;
   //Форма.ТекВес.Цвет(128,000,000); //ТемноБордовый
   Форма.ТекВес.Цвет(000,000,128); //ТемноСиний
   //Попытка
   //    ТВ003 = СоздатьОбъект("Controller.ScAuto");
   //Исключение                                        
   //    Сообщить("Не создан объект связи с весами");
   //    Форма.Параметр = -1;
   //  Форма.Закрыть();
   //КонецПопытки;
   //Проверим наличие подключения
   //Если Найти("5000,5001,5006,5007,5008", СокрЛП(ТВ003.GetWeight(1,1))) <> 0 Тогда
   //    Предупреждение("Вес не может быть получен из-за проблем с подключением весов!!!");
   //    Форма.Параметр = -1;
   //    Форма.Закрыть();
   //КонецЕсли;    
                                     
   //Рез = ТВ003.GetStatus(1,1);  
   Рез = "5003";
   Если Рез = "5003" Тогда
       ДоступностьКнопки = 0;
       Форма.кнПолучить.Доступность(0);
       Форма.ТекВес.Цвет(128,000,000);  
   Иначе
       ДоступностьКнопки = 1;        
       Форма.кнПолучить.Доступность(1);
       Форма.ТекВес.Цвет(000,000,128);  
   КонецЕсли;
   //РезВес = Строка(ТВ003.GetWeight(1,1));
   РезВес = Строка(Вес);
   Форма.ТекВес.Заголовок(РезВес);
   Задержка = 1;
   //с = _getPerformanceCounter();
КонецПроцедуры  

Процедура Определить()    
   Пока КолПопыток <= 10 Цикл
       Вес = Вес + 0.01;
       КолПопыток = КолПопыток + 1;
       //Рез = ТВ003.GetStatus(1,1);
       Рез = "5003";
       Если Рез = "5003" Тогда
           Форма.кнПолучить.Доступность(0);
           Форма.ТекВес.Цвет(128,000,000);  
       Иначе
           Форма.кнПолучить.Доступность(1);
           Форма.ТекВес.Цвет(000,000,128);  
           КолПопыток = 100;  
           Возврат;
       КонецЕсли;
       //РезВес = Строка(ТВ003.GetWeight(1,1));
       РезВес = Строка(Вес);
       Форма.ТекВес.Заголовок(РезВес);  
       Форма.Обновить();
       Задержать(1); //1Секунда задержки
   КонецЦикла;
   Форма.ТекВес.Заголовок("Вес нестабилен!!!");
КонецПроцедуры

Функция ЗапускПроверки()
   Форма.Обновить();
   Если КолПопыток > 30 Тогда
       Возврат "";
   КонецЕсли;    
   Определить();
КонецФункции

Процедура ПриЗакрытии()        
   ТВ003 = 0;  
   Если Форма.кнПолучить.Доступность() = 0 Тогда
       Форма.Параметр = -2;
   КонецЕсли;    
КонецПроцедуры    

Не работает. форма не открывается пока весь цикл не пройдет. Функция ЗапускПроверки повешена на невидимую метку в форме. ВК использовать не хочется, может кто подскажет как правильно сделать... Чтобы форма открывалась, на ней показывалась процедура стабилизации параметра и после стабилизации можно было его передать по кнопке в документ.
1 Ёпрст
 
21.05.13
14:11
(0) И чего не понятно в Рупоровской поделке ?
Или, че ты делал и чего не получилось ?
2 ЧеловекДуши
 
21.05.13
14:17
(0)Можно сделать и не модально :)
+ Ты обрати на то, что в поделке есть "ПриЗакрытии()" :)
3 maestro-72
 
21.05.13
14:40
(1) Вроде внятно написал, что хотел добится, это и не получается. Пробовал делать как по примеру. В примере работает, у меня не работает. Я вот это не писал
if form.parameter<>"modal" then
 openFormModal("Processing#","modal",filePath());

   returnStatus(0);
   return;
endif;                        
объяснишь смысл, могет я не понял чего. Мне без разницы как код будет работать, лишь бы делал то что мне нужно.
при открытии он проверяет модальная форма или нет и запускает ее как модальную еще раз если нет.
4 ЧеловекДуши
 
21.05.13
14:43
(3) Ты вот это еще не писал

procedure onClose()
 if flClose=0 then returnStatus(0) endif;
   flClose=1;
endProcedure
5 ЧеловекДуши
 
21.05.13
14:44
+ И вот этого нет при открытии

flClose=0;
form.close();
6 ЧеловекДуши
 
21.05.13
14:44
+ Это необходимо добавить, что бы форма распахнулась, т.е. ты её увидел :)
7 maestro-72
 
21.05.13
14:46
(6) Так, я уже улыбаюсь, может будет мне счастье...
8 Ёпрст
 
21.05.13
14:57
(3)
При открытии формы проверяется параметр, если он не равен "modal", то форму не открываем вообще (втыкается статусвозврата(0)) и открываем новую форму уже модально с переданным параметром "modal"

Сделано для того, чтобы форма всегда открывалась только модально.

ЗЫ: за место параметра , проще писать так:

Процедура ПриОткрытии()
  Если Форма.МодальныйРежим()=0 Тогда
      СтатусВозврата(0);
      ОткрытьФормуМодально("Отчет#",,РасположениеФайла());
  КонецЕсли;
КонецПроцедуры
9 Ёпрст
 
21.05.13
14:58
(3) И.. я не вижу твоего кода, что ты делал и что не получилось.
10 maestro-72
 
21.05.13
15:01
(9) Да код собственно несколько раз переписывался и так и эдак. Окончательный вариант представлен в (0) после примера, но он не заработал так как надо, все что сказано сейчас буду пробовать...
11 Ёпрст
 
21.05.13
15:14
Дык, ты хочешь, чтоб просто текст на форме обновлялся ?
:)

посмотрел твой пример - так у тебя не заработате - нужно обновлять в ложном закрытии формы, как у Рупора
12 maestro-72
 
21.05.13
15:27
Все, заработало. Кто бы мог подумать про шаманские танцы с бубнами... Всем спасибо кто откликнулся...
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший