主な問題は更新頻度であるため、減らす必要があります。このためには、HTML文書を最後に更新した時点を保存し、次のデータ変更時にその時点から一定期間が経過したかどうかを確認するだけです。
これを行う方法を示すコードは次のとおりです。次の例のFUpdatePeriod
は、ミリ秒単位の更新期間です。その後、UpdateChanges
を定期的に呼び出すと、innerHTML
(ここの疑似コード)は、最後の変更から少なくとも1000ミリ秒が経過したときにのみ更新されます。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, MSHTML, OleCtrls, SHDocVw;
type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
procedure FormCreate(Sender: TObject);
private
FLastUpdate: Cardinal;
FUpdatePeriod: Cardinal;
procedure UpdateChanges(const AData: WideString);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FUpdatePeriod := 1000;
end;
procedure TForm1.UpdateChanges(const AData: WideString);
begin
if (GetTickCount - FLastUpdate > FUpdatePeriod) then
begin
(WebBrowser1.Document as IHTMLDocument2).body.innerHTML := AData;
FLastUpdate := GetTickCount;
end;
end;
// now remains to call the UpdateChanges periodically
end.
'IViewObject'インタフェースには、これに便利な' Freeze'と 'UnFreeze'関数があります。私は例を用意しようとします。 – TLama
私はここで実際のコード(HTMLを含む)を見る必要があると思います。 'WM_SETREDRAW'は実際に動作します(私が作った非常に限られたテストで)。 'innerHTML'は非同期的に動作するので、それを同期させるのが問題になると思います。 – kobik
@kobikしかし、' innerHTML'が非同期であると言うと 'IViewObject'でも助けになるのではないかと心配です。それは準備が整った状態のためのいくつかのチェックでなければなりません。 – TLama