Имя: Пароль:
1C
 
MSScriptControl не получается
0 Андрюха
 
15.02.06
14:51
Хочу сделать простейшее действие - показать MsgBox. Вылетает исключение. Что я не так делаю?

 Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
 Скрипт.Language="vbscript";
   
 Текст = "Сообщение";
 Заголовок = "Заголовок";
 ТекстСкрипта = "MsgBox(""" + Текст + """, 0, """ + Заголовок + """)";
 Результат = Скрипт.Run(ТекстСкрипта);

 Сообщить(Результат);
1 Андрюха
 
15.02.06
14:56
А вот так сработало:

Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.Language="vbscript";
Текст = "Сообщение";
Заголовок = "Заголовок";
ТекстСкрипта = "MsgBox(""" + Текст + """, 0, """ + Заголовок + """)";
   
Скрипт.AddCode("
|Function Main()
|    Main = " + ТекстСкрипта + "
|End Function");
   
Результат = Скрипт.Run("Main");
Сообщить(Результат);
2 WiFi
 
15.02.06
15:01
(0) В первом случае, вероятно, должен использоваться метод ExecuteStatement.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnexpvb/html/usingscriptcontrolmethods.asp
3 Андрюха
 
15.02.06
15:10
Не работает. Изменил в коде:
...
ТекстСкрипта = "MsgBox(""" + Текст + """, 36, """ + Заголовок + """)";

//Скрипт.AddCode("
//|Function Main()
//|    Main = " + ТекстСкрипта + "
//|End Function");
//
//Результат = Скрипт.Run("Main");

Результат = Скрипт.ExecuteStatement(ТекстСкрипта);
...
4 Андрюха
 
15.02.06
15:11
И сразу попутно вопрос - может кто знает как задать таймаут для MsgBox и значение по таймауту?
5 Андрюха
 
15.02.06
15:13
Нашёл! Спасибо WiFi. Оказывается надо использовать Eval. Во как:

Результат = Скрипт.Eval(ТекстСкрипта);
6 smaharbA
 
15.02.06
15:15
Для мсгбокса нет таймаута, нужен Popyp объекта WScript.Shell но если "напрямую" из 1С к этому объекту то таймаута небудет, через МССкрипт будет
7 WiFi
 
15.02.06
15:16
(5) будем знать ;)
8 Андрюха
 
15.02.06
15:16
(6) А можно пример кода накидать?
9 Андрюха
 
15.02.06
15:17
Я так понимаю, что надо из MSScript слепить WScript.Shell ?
10 WiFi
 
15.02.06
15:19
В самом методе MsgBox нет такого параметра Timeout:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/ae073d50-e4a4-4e23-8e46-0cb1369965e7.asp
11 smaharbA
 
15.02.06
15:38
scr =Новый COMОбъект("MSScriptControl.ScriptControl");
scr.Language="javascript";
text = "'Сообщение'";
head = "'Заголовок'";
scr.ExecuteStatement("var WSHShell=new ActiveXObject('WScript.Shell')");
//Но просче так
//WSHShell=Новый COMОбъект("WScript.Shell");
//scr.AddObject("WSHShell",WSHShell);
//или еще проще (всего две строчки)
//WSHShell=Новый COMОбъект("WScript.Shell");
//WSHShell.Popup(Text,Timing,Head,3);
scr.ExecuteStatement("Text=" + text);
scr.ExecuteStatement("Head=" + head);
scr.ExecuteStatement("Timing=" + 2);
scr.Eval("WSHShell.Popup(Text,Timing,Head,3);");
...
Незнаю как в 8-ке, но в 7-ке таймаут небудет работать
12 Андрюха
 
15.02.06
15:39
А я делаю вот так. И к меня ругается на CreateObject. Вот код:

Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.Language="vbscript";
Скрипт.AddCode("
|Function Main()
|  Obj=CteateObject(""WScript.Shell"")
|  Main = Obj.Popup(""" + Текст + """, " + Формат(Таймаут, "ДП=0") + ", """ + Заголовок + """, 32)
|End Function");
Результат = Скрипт.Run("Main");
Сообщить(Результат);
13 smaharbA
 
15.02.06
15:40
CteateObject ?
14 WiFi
 
15.02.06
15:41
(3) у тебя здесь не сработало, т.к. скобки у MsgBox не нужны. Так правильно:
ТекстСкрипта = "MsgBox """ + Текст + """, 36, """ + Заголовок + """";
Результат = Скрипт.ExecuteStatement(ТекстСкрипта);
Правда Результата не будет никакого. Только Box и появится ;)
(5) а здесь сработало, т.к. MsgBox со скобками возвращает значение.
Вывод:
Run - используется для вызова процедуры,
ExecuteStatement - для выполнения кода, который не возвращает значения,
Eval - для вычисления значения.
15 WiFi
 
15.02.06
15:43
(13) :)))
16 Андрюха
 
15.02.06
15:44
(13) Но. А чо?
17 smaharbA
 
15.02.06
15:45
(16) Еще внимательней глянь...
18 Salvador Limones
 
15.02.06
15:45
(16) Не видишь?
19 Андрюха
 
15.02.06
15:46
Да я уж вижу. New ActiveX
20 Андрюха
 
15.02.06
15:47
В примерах, кстати есть его использование:

'создаётся объект типа "IShellDispatch":
Set objShellApp = CreateObject("Shell.Application")
21 smaharbA
 
15.02.06
15:47
(19) Нет, это я применил чтобы с кавычками не париться, а апострофы использовать
а у тебя CteateObject <> CreateObject
22 Андрюха
 
15.02.06
15:48
аааа.... точно! Сенкс!
23 smaharbA
 
15.02.06
15:48
+(21) new ActiveXObject это javascript...
24 Андрюха
 
15.02.06
15:48
Но таймаута всё-равно нету. Нигде.
25 smaharbA
 
15.02.06
15:50
А зачем тебе через мсскрипт, есть ведь предупреждение ?
26 Андрюха
 
15.02.06
15:50
Оно без иконок.
27 Андрюха
 
15.02.06
15:51
Warning, Information и т.д.
28 smaharbA
 
15.02.06
15:52
(26) Есть способ, но тоже проблематичный...
А почему-бы модальную форму не применить? А тайминг можно и системный задействовать
29 smaharbA
 
15.02.06
18:54
На форму кнопку(скрытую) с хоткеем F12 и текст скрытый с формулой Закрыть
...
Перем т;
//*******************************************
Функция Закрывать()
   Форма.Заголовок(ТекущееВремя());
   Если т<_GetPerformanceCounter()-10000 Тогда
       Форма.Закрыть();
       Возврат т;
   КонецЕсли;
   Форма.Обновить();
КонецФункции    // Закрывать
Процедура ПриОткрытии()
   т=_GetPerformanceCounter();
   WSHShell=СоздатьОбъект("WScript.Shell");
   WSHShell.SendKeys("{F12}");
КонецПроцедуры    // ПриОткрытии
...
30 Андрюха
 
16.02.06
06:11
(28) Не, с модальной формой - это не то. Хотелось чем-то типа MsgBox. Может кто-нибудь знает способ вызвать системный диалог с таймаутом и значением по умолчанию?
31 smaharbA
 
16.02.06
06:42
(30) Дак вот и попробуй (29) и увидишь что выйдет, кнопок с действиями сколь угодно... и иконок...страшащих картинок...
32 Андрюха
 
16.02.06
07:18
Спасибо, но это не то. Это надо форму, то-сё... MsgBox было бы элегантней, ну да видать не судьба.
2 + 2 = 3.9999999999999999999999999999999...