|
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
|
Все, заработало. Кто бы мог подумать про шаманские танцы с бубнами... Всем спасибо кто откликнулся...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |