我在表单上有以下控件:Memo1、Memo2 和 WebBrowser。 控件 Memo1 和 Memo2 的 OnExit 过程是用 Memo1.Text 和 Memo2.Text 的内容更新 WebBrowser 的内容。我为此使用以下程序:
procedure LoadBlankDoc(WB: TWebBrowser);
begin
WB.Navigate('about:blank', EmptyParam, EmptyParam, EmptyParam, EmptyParam);
while WB.ReadyState = READYSTATE_COMPLETE do
begin
Application.ProcessMessages;
Sleep(0);
end;
end;
procedure CheckDocReady(WB: TWebBrowser);
begin
if not Assigned(WB.Document) then
LoadBlankDoc(WB);
end;
procedure LoadDocFromString(WB: TWebBrowser; const HTMLString: string);
var
v: OleVariant;
HTMLDocument: IHTMLDocument2;
begin
CheckDocReady(WB);
HTMLDocument := WB.Document as IHTMLDocument2;
v := VarArrayCreate([0, 0], varVariant);
v[0] := HTMLString;
HTMLDocument.Write(PSafeArray(TVarData(v).VArray));
HTMLDocument.Close;
end;
问题是,当Memo1控件处于活动状态时,我们在WebBrowser区域中单击,然后在Memo2区域中单击,然后在输入第一个字符后光标不出现或消失。有时应用程序会丢失,您根本无法在备忘录中输入文本。 还有一件事:当我在 Memo1 和 Memo2 之间移动时,一切正常。通过单击 WebBrowser 区域出现 OnExit 时会出现此问题。 可能是什么原因?
2023-05-09
我对题目的进一步分析...
在论坛上发布这个问题,我相当怀疑 LoadDocFromString 过程中的一些错误。 然而,进一步的实验表明:
如果我们将焦点放在某些 Memo 控件上,例如。 Memo1,然后我们点击WebBrowser区域,然后焦点就从Memo1上移开了……但是!不执行 Memo1Exit 过程。
如果我们现在点击其他控件,例如Memo2,现在执行 Memo1Exit。
一切正常...
但是,在 Memo 控件的 OnExit 事件中调用 LoadDocFromString 就足够了……问题就开始了。