6

私がしようとしていること:

常にズームイン(〜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.DefaultDispathWebBrowser1.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 をクリックする前とクリックした後の両方で、リンクをクリックしてみてください。ズームした後、失敗します。

4

2 に答える 2

2

問題は、OnDocumentComplete がドキュメントの読み込み (フレームのあるページ) で複数回発生することがあることだと思います。

これを適切に実装する方法を次に示します。

于 2012-06-27T11:22:07.000 に答える