2011-01-19 12 views
1

私はいくつかのスプリッタとパネルを持つフォームを持っています。中央には、alClientを整列するように設定されたTWebBrowserで終わるパネルがあります。クライアント領域が変更されたときにalClientに設定されたTWebBrowserのサイズは変更されません

これまではうまくいきました。ただし、Internet Explorer 8を搭載したWindows 7では、ブラウザのサイズが正しく調整されていません。他のすべて(パネルなど)は、ウェブブラウザではなく、正しいサイズです。ときどきブラウザをクリックすると、ブラウザをスクロールするときにブラウザが正しいサイズにジャンプすることがあります。それは時間の100%しかし起こることはありません。

私はサイズ変更に直接対処し、サイズを変更するようにコントロールしています。

TWebBrowserは、Internet ExplorerのコントロールをラップするOLEコントロール(ActiveX)です。どのように私はサイズ変更を行うことができます上の任意のアイデアですか?

更新背景:

私は私が別のフォーム内のサイトに親を変更する子フォームを持っている場合にのみ起こっにこれを絞り込みます。私のTWebBrowserコントロールは、HTMLドキュメントを表示する必要があるときに私が使用する子フォームにあります。

私の親のフォームにグリッド、スプリッタ、およびグリッドが[上揃え]に設定され、パネルがクライアントを整列するように設定されたパネルがあります。私の子フォーム(THtmlViewerと呼ばれる)の親はパネルに設定されています。 THtmlViewerフォームはalClientに設定され、子フォームのTWebBrowserコントロールもクライアントを調整するように設定されます。

THtmlViewerフォームのサイズ変更フォームで何か操作を行うと、この問題が発生します。 FormResize内に直接存在するもの、またはalignプロパティを使用して間接的に存在するものしかし、親フォームからサイズ変更を呼び出すと、すべて正常に動作します。

キーがTHtmlViewerフォームのサイズ変更コードを無効にしているようです。 OnResizeハンドラまたはアライメントセットを残しておけば、親で何をするかは関係ありません。リサイズは正しく行われません。

これがなぜ必要なのか、正しいサイズ変更(THtmlViewer)で強制的に更新することができない理由は、私はまだ混乱しています。

私はまた、Delphi 2007 for Windows 7がIDEの「ようこそページ」とまったく同じ問題を抱えていることに気付きました。

私はこの問題を回避するために、子フォームのOnResizeをnilに設定し、親のOnResizeハンドラから内部のForceResizeを呼び出すメソッドを追加しました。私はまだこのすべてをTHtmlViewerフォームから扱いたいと思っています。私はこのハックを避けることができるという答えを受け入れます。

答えて

0

私はWebBrowser1.WidthにWebBrowser1.Widthを設定

  • 、alLeftにWebBrowser1.Alignを変更

    • のようなものを試してみた - 1と
    再びalClientにWebBrowser1.Alignを設定しますOnResizeハンドラ内の
  • +1

    私は質問をさらに詳細に更新しました。 「親」フォームからのこれらの呼び出しは機能しますが、ネストされたフォームでは、OnResizeハンドラの何も正しく動作していないようです。 –

    1

    はたぶん、この質問のための同じ溶液に動作します。さらにonResizeでResize problem using AcroPDF in Delphi

    :そのコンテナの変更のサイズは、次の2つの他のオプションを持っている場合

    if Visible and (WebBrowser1 <> nil) then 
    begin 
        FocusControl(nil); 
        FocusControl(WebBrowser1); 
    end; 
    
    +0

    WebブラウザコントロールでFocusコントロールを呼び出そうとすると、何らかの理由で例外が発生します。私は問題を引き起こしている可能性のある入れ子になったフォームを持つ珍しい設定をしています。フレームを使用する代わりにフォームを再作成します。コントロールに焦点を当てることができますが、私はそれを確認することはできません。私は別の解決策を見つけたので、私はこれを稼働させようとしなかった。 –

    2

    は「ちょうど」Alignプロパティを使用してほかのコントロールのサイズを変更するには:

    • Alignプロパティを使用せずにAnchorsプロパティを使用します。つまり、AlignプロパティをalCustomまたはalNoneに設定してからtを設定します。彼はあなたの必要に応じてアンカーします。 Alignプロパティはアンカーを設定するための短い手続きのようなものなので、これは同じアラインメント処理に依存しているため、あなたのケースでは機能しない可能性があります。

    • TWebBrowserが置かれているコンテナのOnResizeイベントのハンドラを用意し、TWebBrowserの高さと幅をコンテナの高さと幅に手動で設定します(オプションでコンテナ内の余白を調整します)。

    私はWindows7を持っていないと言いました。だから、これ以上の手間がかからないことを保証することはできません。

    スクロールまたはクリック時にTWebBrowserが正しいサイズにジャンプした場合、実際に変更に応答するメッセージが受信されたり処理されたりすることはありません。

    これは、再調整コントロールが不必要な再描画や再帰を防ぎ、何らかの形で混乱するためです。 OnResizeメソッドを使用すると、「TWebBrowserに直接話す」ように、より良い結果を得ることができます。

    再ペイントは、コントロールがコントロールスタイルにcsOpaqueを持たない限り、無効化と更新を「ちょっと」省略したものです。だから、あなたはTWebBrowserのTransparentプロパティやそれが置かれているコンテナを使って試すことができます。

    その他すべてが失敗した場合は、WM_PAINT(または同様のもの)をTWebBrowserに直接送信することができます。たとえば、TWebBrowserのOnResizeイベントまたはその上に置かれているコンテナにあります。 TWebBrowserのWM_Paintハンドラは、OnResizeイベントから呼び出されたときに正しい次元を持つはずのClientRectを使用してActiveXに直接通話するOleDrawを呼び出します。

    +0

    WM_PAINTメッセージを送信しても影響はありませんでした。コントロールが新しいサイズを知っているようなサイズ変更が発生したときにパネルの色が変わるのがわかりますが、WebBrowserコントロールの実際の内容は古いサイズの中にしか描画されません。 –

    +0

    @マーク:TFebrameにTWebBrowserを入れてHTML文書を表示する必要のあるフォームに追加しようとしましたか?TFrameは、TFormを別のTFormに再親和させるという問題のほうがはるかに少ないようです。 –

    1

    私は同様の問題がありました。

    TWebBrowserの下にTPanelを置き、WebブラウザをalClientに合わせることで解決しました。

    関連する問題