1

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

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

我想以某种方式按需刷新屏幕。

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

由于我的屏幕是由模型驱动构建的(我无法预测屏幕上会出现哪些组件以及组件之间的相互依赖关系,即在业务逻辑中),因此我无法添加 JavaScript 来根据用户操作启用或禁用按钮。

4

2 回答 2

0

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

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

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

格特

于 2009-10-25T17:01:46.493 回答
0

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

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

IW 精英可以在这里找到: 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);
于 2009-10-31T21:22:14.513 回答