IntraWeb表格可以按需同步吗?

时间:2009-10-23 12:45:35

标签: delphi delphi-2006 intraweb

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

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

我想根据需要以某种方式刷新屏幕。

  • 确定两者是否同步并发出刷新的计时器在流量和计时方面存在缺陷(我可以在计时器运行之前单击按钮)。
  • 可以推送数据的方法很棒。
  • 也许IW有可能在不取消我刚刚提交的动作的情况下进行非保存同步。

由于我的屏幕是基于模型驱动的(我无法预测屏幕上将显示哪些组件以及组件之间的相互依赖性,即业务逻辑中),我无法根据用户添加JavaScript来启用或禁用按钮动作。

2 个答案:

答案 0 :(得分:0)

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

根据Jackson Gomes的一些评论,我在长时间运行的线程启动之前启用TIWTimer,并在线程结束后禁用它。请参阅:http://forums3.atozed.com/IntraWeb.aspx(atozedsoftware.intraweb.attachments),线程'IWLabel update via Thread',2009年10月15日。

OnASync定时器事件每500毫秒触发一次并使用一些带宽。在我的情况下可以接受(公司内部网)。

格特

答案 1 :(得分:0)

您可以使用IWElite组件包中的Interop Web模块。

基本上你会使用XMLHTTPRequest(XHR)对象编写一些Javascript来调用你的IW应用程序的Web模块操作,该操作在处理完成时返回。如果你需要你的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);