1

シナリオ: 画面上にいくつかの編集コンポーネントとボタンを持つ Delphi Intraweb アプリケーションがあります。TIWEdit.OnAsyncExit と TIWButton.OnClick でフラグが設定され、アプリケーションの別のスレッドが、フラグとその他のアプリケーション データに応じて、ボタンの有効なプロパティを設定します。

TIWButton.Enabled プロパティが設定されるまでに、リクエストはすでに終了しており、IW が内部表現と HTML フォームが同期していないことを検出すると、次の対話はキャンセルされます。再同期するため、もう一度クリックする必要があります。

オンデマンドで何らかの方法で画面を更新したいと思います。

  • 2 つが同期されているかどうかを調べて更新を発行するタイマーには、トラフィックとタイミングの点で欠点があります (タイマーが実行される前にボタンをクリックできます)。
  • データをプッシュできる方法は素晴らしいでしょう。
  • おそらく、IW には、コミットしたばかりのアクションをキャンセルせずに、保存以外の同期を行う可能性があります。

私の画面はモデル主導で構築されているため (どのコンポーネントが画面に表示されるのか、コンポーネント間の相互依存関係は何か、つまりビジネス ロジックでは予測できない)、JavaScript を追加して、ユーザーのアクションに応じてボタンを有効または無効にすることはできません。

4

2 に答える 2

0

あなたの質問が私のものと同じかどうかは完全にはわかりませんが、共通点はたくさんあると思います。Intrawebフォーラムに投稿したデモプロジェクト(v2)を参照してください。

Jackson Gomesからのコメントに基づいて、長時間実行されるスレッドが開始する前にTIWTimerを有効にし、スレッドが終了した後にこれを無効にします。http://forums3.atozed.com/IntraWeb.aspx(atozedsoftware.intraweb.attachments)、スレッド「スレッドを介したIWLabelの更新」、2009年10月15日を参照してください。

OnASyncタイマーイベントは500ミリ秒ごとに発生し、帯域幅を使用しています。私の状況では受け入れられます(会社のイントラネット)。

ガート

于 2009-10-25T17:01:46.493 に答える
0

IWElite コンポーネント パックの Interop 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 に答える