Можно ли синхронизировать формы IntraWeb по запросу?

Сценарий: у меня есть приложение Delphi Intraweb, в котором есть некоторые компоненты редактирования и кнопки на экране. В TIWEdit.OnAsyncExit и TIWButton.OnClick установлен флаг, а другой поток в приложении устанавливает включенные свойства кнопок в зависимости от флагов и некоторых других данных приложения.

К моменту установки свойств TIWButton.Enabled запрос уже завершен, и следующее взаимодействие отменяется, поскольку IW обнаруживает, что внутреннее представление и HTML-форма не синхронизированы. Он повторно синхронизируется, и вам нужно щелкнуть еще раз.

Хотелось бы как-нибудь обновить экран по запросу.

  • Таймер, который определяет, синхронизированы ли они и выдает обновление, имеет недостатки в трафике и времени (я могу нажать кнопку перед запуском таймера).
  • Метод, который мог бы передавать данные, был бы отличным.
  • Возможно, у IW есть возможность выполнить синхронизацию без сохранения без отмены действия, которое я только что совершил.

Поскольку мои экраны построены на основе модели (я не могу предсказать, какие компоненты будут на экране и каковы взаимозависимости между компонентами, то есть в бизнес-логике), я не могу добавить JavaScript для включения или отключения кнопки в зависимости от действий пользователя.


person Ralph M. Rickenbach    schedule 23.10.2009    source источник


Ответы (2)


Я не совсем уверен, совпадает ли ваш вопрос с моим, но думаю, что есть много общего. См. Демонстрационный проект (v2), который я разместил на форуме Intraweb.

Основываясь на некоторых комментариях Джексона Гомеса, я включаю TIWTimer перед запуском длительного потока и отключаю его после завершения потока. См .: http://forums3.atozed.com/IntraWeb.aspx (atozedsoftware.intraweb. вложения), ветка 'Обновление IWLabel через поток', 15 октября 2009 г.

Событие таймера OnASync запускается каждые 500 мс и использует определенную полосу пропускания. Приемлемо в моей ситуации (интранет компании).

Герт

person Gert de Boom    schedule 25.10.2009
comment
Извините, это не поможет мне, так как я иногда нахожусь в дикой природе с большим трафиком. Но спасибо за ответ. - person Ralph M. Rickenbach; 27.10.2009

Вы можете использовать Interop Web Module из пакета компонентов IWElite.

По сути, вы должны написать немного Javascript, используя объект XMLHTTPRequest (XHR) для вызова действия веб-модуля вашего приложения IW, которое возвращается после завершения обработки. Если вам нужно, чтобы ваше приложение IW продолжало работать в обычном режиме во время выполнения процесса, ваш Javascript может открыть окно прогресса и сделать оттуда вызов XHR.

IW Elite можно найти здесь: http://code.google.com/p/iwelite/

Запрос XHR будет выглядеть примерно так:

function NewXHR() {
  if (typeof XMLHttpRequest == "undefined") {
    try { return new ActiveXObject('Msxml2.XMLHTTP.6.0');} catch(e) {}
    try { return new ActiveXObject('Msxml2.XMLHTTP.3.0');} catch(e) {}
    try { return new ActiveXObject('Msxml2.XMLHTTP');} catch(e) {}
    try { return new ActiveXObject('Microsoft.XMLHTTP');} catch(e) {}
    throw new Error('AJAX not supported in this browser.');
  } else {
    return = new XMLHttpRequest();
}

var xhr = NewXHR();
xhr.open("get", '/mywebaction', false);
xhr.send(null);
window.alert(xhr.responseText);

Приведенный выше код заблокируется и будет ждать ответа. Если вы предпочитаете, чтобы он работал асинхронно, вы могли бы вместо этого сделать следующее:

var xhr = NewXHR();
xhr.open("get", '/mywebaction', true);
xhr.onreadystatechange = function() {
  if(xhr.readyState == 4) {
    if ((xhr.status == 200) || (xhr.status == 304) || (xhr.status === 0)) {
      window.alert('Success: '+xhr.responseText);
    } else {
      window.alert('Error: ('+xhr.status+') '+xhr.statusText;
    }
  }
};
xhr.send(null);
person Jason Southwell    schedule 31.10.2009