1 (изменено: index, 2011-03-03 22:10:35)

Тема: Kixtart/JScript: запустить в цикле form.DoEvents()

Пожалуйста помогите разобраться как запустить в цикле  form.DoEvents();
В Kixtart и VBS это делается с помощью  Execute.
Пробовал через call  JScript, но к сожалению ничего не вышло.

// Kixtart 

Break On
$System = CreateObject("Kixtart.System")
$Form = $System.Form()
$Form.Text = "Application"
$Form.Show
While $Form.Visible 
 $=Execute($Form.DoEvents) 
Loop 
Exit 0

//-----------------------------
// JScript

var system = new ActiveXObject("Kixtart.System");
form = system.Form();
form.Text = "Application";

var button = form.Controls.Add("Button");
button.Text = "ok";
button.Center();
button.OnClick =buttonClick;


function buttonClick(){        
WScript.Echo("OK");
};


form.Center();
form.Show();



а вот здесь проблема с  Execute, не получается перхватить события 
как это можно решить на JScript ?

while (form.Visible){
form.DoEvents();
}

-----------------

2

Re: Kixtart/JScript: запустить в цикле form.DoEvents()

index, код оформляется тэгом «code», предложения пишутся с заглавной буквы. Я поправил Ваш пост.

3

Re: Kixtart/JScript: запустить в цикле form.DoEvents()

Вероятно, использовать в цикле метод WScript.Sleep с небольшой задержкой (а может быть и с большой).

Забыл пароль и потерял e-mail.

4 (изменено: index, 2011-03-04 22:27:33)

Re: Kixtart/JScript: запустить в цикле form.DoEvents()

shiz пишет:

Вероятно, использовать в цикле метод WScript.Sleep с небольшой задержкой (а может быть и с большой).

ок, и как это можно использовать для перехвата событий?
WScript.Sleep только приостанавливает выполнение скрипта на какой то промежуток.
а я ищу способ выполнения методов, в ответ на те или иные события.
в языке Kixtart есть метод Execute, но аналогичного в JScript пока не нашел.
возможно требуется задействовать метод какого нибудь другого OLE Automation.
пробовал использовать такую конструкцию:

while (form.Visible){
buttonClick.call(form.DoEvents()); 
}

вариант работает, но не является универсальным для других событий кнопок.
значит "call"  или "apply" можно исопльзовать, просто нужно получить ссылку на объект, который передал события. к сожалению пока не нашел вариант как это сделать.

что я добиваюсь ? возмжность использования JScript при работе с kixforms.dll

в "Kixtart.System"  ActiveX я нашел свойство, которое пытаюсь исользовать для перехвата событий "EventHandler", правда пока безрезультатно.

button.OnClick =system.EventHandler(form, buttonClick);

5

Re: Kixtart/JScript: запустить в цикле form.DoEvents()

index, либо Вы начнёте читать и учитывать замечания модератора, либо будет как-то так.

6 (изменено: wisgest, 2014-01-04 01:51:31)

Re: Kixtart/JScript: запустить в цикле form.DoEvents()

Заинтересовался поднятым вопросом.

http://www.script-coding.com/KiXtart.html:

Язык KiXtart имеет средства построения GUI — плагин KiXforms.

Я бы сказал, что KiXforms — никакой не плагин языка KiXtart, а вполне самоценный продукт. Впрочем, в той же статье далее:

Примечательно, что COM-серверы Kixtart.System и Kixforms.System можно использовать и в других языках программирования, которые в состоянии выступить в роли OLE-клиента.

— я бы только убрал подчёркнутое мною.

Также упоминание KiXforms здесь на форуме нашёл лишь в теме «VBS:  Разновидности графических окон».
--------------------

index пишет:
button.OnClick =buttonClick;

— в этом месте ошибка — в KiXforms свойство .OnClick и подобные ему — это не ссылки на функции-обработчики событий, а строковые значения, возвращаемые методом Form.DoEvents() при наступлении соответствующего события. Если в языке есть средства позволяющие вычислить выражение или выполнить произвольный код на этом языке из строки (в JScript — это функция eval()), то возвращаемой строкой может быть такое выражение — вызов функции обработчика. (Если таких средств в языке нет, то ничего не потеряно — можно возвращать строку однозначно связанную с произошедшим событием для использования в качестве условия оператора ветвления.) Таким образом, чтобы исходный пример заработал, в нём нужно исправить:

//...
button.OnClick = "buttonClick()";
//...

while (form.Visible) {
    eval(form.DoEvents());
}

04.01.2014: А лучше — без eval().

7

Re: Kixtart/JScript: запустить в цикле form.DoEvents()

wisgest пишет:

— я бы только убрал подчёркнутое мною.

Ну, сие не столь существенно.

8

Re: Kixtart/JScript: запустить в цикле form.DoEvents()

alexii, это было не требование поскорее изменить статью на сайте, а скорее мысли вслух при ознакомлении с предметом, т.к. я только что познакомился с библиотекой KiXforms и нашёл её довольно интересной, при этом её отношение к KiXtart достаточно условным.

9 (изменено: wisgest, 2014-01-04 04:31:48)

Re: Kixtart/JScript: запустить в цикле form.DoEvents()

eval() is not evil, но лучше обходится без перевызовов интерпретатора. Во многих случаях этому может помочь представление объектов как ассоциативных массивов с именами свойств и методов в качестве индексов.

Это годится и для нашего случая: надо, чтобы обработчики всех событий были методами какого-то одного объекта, а Form.DoEvents() возвращал только их названия, а не вызывающие выражения (т.е. без круглых скобок в конце). Если обработчики — глобальные функции, то они уже методы глобального объекта.

//...
button.OnClick = "buttonClick";
//...

while (form.Visible) {
    var eventName = form.DoEvents();
    if (eventName) this[eventName]();
}

— в примере учтено, что при закрытии формы Form.DoEvents() завершает работу и возвращает пустую строку. Возможно, даже лучше воспользоваться одним этим условием для выхода из цикла вместо проверки свойства Form.Visible:

//...
button.OnClick = "buttonClick";
//...

var eventName;
while (eventName = form.DoEvents()) this[eventName]();
    //в условии цикла - присваивание, а не равенство

+ P.S. Исключительно для полноты изложения
shiz пишет:

Вероятно, использовать в цикле метод WScript.Sleep с небольшой задержкой (а может быть и с большой).

Можно (с небольшой), но не нужно.

Form.DoEvents() может работать в двух режимах, задаваемых необязательным логическим аргументом:
синхронном (по умолчанию) — приостанавливая работу, если очередь событий пуста,
и асинхронном — возвращая в таком случае пустую строку без задержки.

В асинхронном режиме второй цикл работать не будет, а первый будет, но с большой загрузкой процессора. Вот, чтобы её убрать и надо было бы в асинхронном режиме добавить в цикл WScript.Sleep().

10 (изменено: index, 2015-04-27 21:17:52)

Re: Kixtart/JScript: запустить в цикле form.DoEvents()

уважаемый  wisgest!
теперь все работает!
тысячи благодарностей и наилучших пожеланий!

11

Re: Kixtart/JScript: запустить в цикле form.DoEvents()

Одна из реализаций применения KiXforms для 1Script с примерами и русской справкой по адресу https://bitbucket.org/ahyahy/gui-1script/src
Так сказать проба пера. Может пригодится. Над справкой работаю, русификация, подробные примеры и т.п.