私がしようとしていること:
常にズームイン(〜140%)され、すべてのリンクを同じWebブラウザに保持するTWebBrowserが必要です(つまり、_BLANKリンクは同じブラウザコントロールで開く必要があります)。
どのように私はそれをやっている:
レジストリを 9999 に設定したFEATURE_BROWSER_EMULATION
ので、Web ページは IE9 でレンダリングされます。これで動作することを確認しました。さらに、IE9 を使用して Windows 7 を新規インストールし、Windows Update で完全に更新してコンパイルしたプログラムを実行しています。
ズーム:
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
ZoomFac: OLEVariant;
begin
ZoomFac := 140;
WebBrowser1.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, ZoomFac);
end;
これは完全に機能します。
同じブラウザ コントロールで新しいウィンドウを開きます。
デフォルトでは、TWebBrowser は、新しいウィンドウで開くように設定されたリンクに遭遇すると、新しい IE を開きます。プログラム/ウェブブラウザにとどまるために必要です。
私はここで多くのことを試しました。これは私のために働く:
procedure TFormWeb.WebBrowser1NewWindow3(ASender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool; dwFlags: Cardinal;
const bstrUrlContext, bstrUrl: WideString);
begin
Cancel := True;
WebBrowser1.Navigate(bstrUrl);
end;
新しいウィンドウをキャンセルし、代わりに同じ URL に移動します。
インターネット上のさまざまなページの他の情報源は、私がキャンセルせず、代わりにWebBrowser1.DefaultDispath
やWebBrowser1.Application
やそれらのバリエーションなどのさまざまなものに ppDisp を設定することを示唆しています。これは私にはうまくいきません。_BLANK リンクをクリックしても何も起こりません。これは、2 台のコンピューター (Win7 と IE9 の両方) でテストされています。なぜうまくいかないのかはわかりません。なぜなら、これはインターネット上の他の人にも当てはまるように見えるからです。多分これで問題は解決するでしょうか?
今問題:
これら 2 つのコードを組み合わせると、壊れてしまいます。
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('http://wbm.dk/test.htm');
// This is a test page, that I created. It just contains a normal link to google.com
end;
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
ZoomFac: OLEVariant;
begin
ZoomFac := 140;
WebBrowser1.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, ZoomFac);
end;
procedure TForm1.WebBrowser1NewWindow3(ASender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool; dwFlags: Cardinal; const bstrUrlContext,
bstrUrl: WideString);
begin
Cancel := True;
WebBrowser1.Navigate(bstrUrl);
end;
実行時に Web ブラウザでリンク (通常か _BLANK かに関係なく) をクリックすると、次のエラーが発生します。
First chance exception at $75F1B9BC. Exception class EOleException with message 'Unspecified error'. Process Project1.exe (3288)
コードのいずれかの部分を削除すると、機能します (明らかに、削除されたコードはありません)。
両方を同時に機能させるのを手伝ってくれる人はいますか?
御時間ありがとうございます!
アップデート:
これは、新しいウィンドウを正しくトラップして、同じブラウザー コントロールに保持することの問題です。OnDocumentComplete のズーム コードは、私が知る限り、それとは何の関係もありません。一般的なズームです。WebBrowser コントロールがズームされている場合 (1 回で十分です)、NewWindow3 のコードは「特定できないエラー」で失敗します。ズーム レベルを 100% にリセットしても効果はありません。
ズーム コード (ExecWB) を使用すると、WebBrowser の何かが「永久に」変更され、NewWindow3 のコードと互換性がなくなります。
誰でもそれを理解できますか?
新しいコード:
procedure TForm1.Button1Click(Sender: TObject);
var
ZoomFac: OLEVariant;
begin
ZoomFac := 140;
WebBrowser1.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, ZoomFac);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('http://www.wbm.dk/test.htm');
end;
procedure TForm1.WebBrowser1NewWindow3(ASender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool; dwFlags: Cardinal; const bstrUrlContext,
bstrUrl: WideString);
begin
Cancel := True;
WebBrowser1.Navigate(bstrUrl);
end;
Button1 をクリックする前とクリックした後の両方で、リンクをクリックしてみてください。ズームした後、失敗します。