Delphi IntraWeb表单是否可以按需同步?

Delphi IntraWeb表单是否可以按需同步?,delphi,delphi-2006,intraweb,Delphi,Delphi 2006,Intraweb,场景:我有一个DelphiIntraWeb应用程序,它在屏幕上有一些编辑组件和按钮。在TIWEdit.OnAsyncExit和TIWButton.OnClick中设置了一个标志,应用程序中的另一个线程根据标志和一些其他应用程序数据设置按钮的启用属性 设置TIWButton.Enabled属性时,请求已经完成,下一次交互将被取消,因为IW发现内部表示和HTML表单不同步。它将重新同步,您必须再次单击 我想根据需要刷新屏幕 一个计时器可以发现两者是否同步并发出刷新,但在流量和计时方面存在缺陷。我可以

场景:我有一个DelphiIntraWeb应用程序,它在屏幕上有一些编辑组件和按钮。在TIWEdit.OnAsyncExit和TIWButton.OnClick中设置了一个标志,应用程序中的另一个线程根据标志和一些其他应用程序数据设置按钮的启用属性

设置TIWButton.Enabled属性时,请求已经完成,下一次交互将被取消,因为IW发现内部表示和HTML表单不同步。它将重新同步,您必须再次单击

我想根据需要刷新屏幕

一个计时器可以发现两者是否同步并发出刷新,但在流量和计时方面存在缺陷。我可以在计时器运行之前单击一个按钮。 一种可以推送数据的方法会很棒。 也许IW可以在不取消我刚刚提交的操作的情况下执行非保存同步。
由于我的屏幕是由模型驱动构建的,我无法预测屏幕上会出现哪些组件以及组件之间的相互依赖关系,也就是在业务逻辑中,我无法添加JavaScript以根据用户操作启用或禁用按钮。

我不完全确定您的问题是否与我的相同,但我认为有很多共同点。请参阅我在Intraweb论坛上发布的演示项目v2

根据Jackson Gomes的一些评论,我在长时间运行的线程启动之前启用TIWTimer,在线程结束之后禁用它。请参阅:atozedsoftware.intraweb.attachments,线程“通过线程更新IWLabel”,2009年10月15日

OnASync计时器事件每500毫秒触发一次,并且正在使用一些bandwith。在我公司内部网的情况下可以接受


Gert

您可以使用IWElite组件包中的互操作Web模块

基本上,您将使用XMLHTTPRequest XHR对象编写一点Javascript,以调用IW应用程序的Web模块操作,该操作在处理完成时返回。如果您需要IW应用程序在进程运行时继续正常运行,您的Javascript可以打开一个进度窗口并从那里调用XHR

IW Elite可在此处找到:

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);

对不起,这对我来说不行,因为我在野外,有时交通繁忙。但是谢谢你的回答。