Можно ли синхронизировать формы IntraWeb по требованию? - PullRequest
1 голос
/ 23 октября 2009

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

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

Я бы хотел как-нибудь обновить экран по требованию.

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

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

Ответы [ 2 ]

0 голосов
/ 01 ноября 2009

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

По сути, вы бы написали немного Javascript, используя объект XMLHTTPRequest (XHR) для вызова в действие модуля Web вашего приложения 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);
0 голосов
/ 25 октября 2009

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

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

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

Герт

...