0

実行時にTFrameを埋め込んで作成し、アプリケーションのメインフォームにドッキングするJordanRusselのToolbar2000ツールバーがあります。このフレームには、他のパネルやさまざまなコントロールを含むペインが埋め込まれています。したがって、構造は次のとおりです。

TTBDock
  TTBToolbar
    TFrame     (align=alNone, Autosize=true)
      TPanel 1     (align=alNone, Autosize=true)
        TPanel 2     (align=alTop ,Autosize = false)
        TPanel 3     (align=alTop ,Autosize = false)
        TPanel 4     (align=alTop , Autosize = false)

パネル2、3、4の高さは明示的にサイズ設定され、フレーム(したがってツールバー)は新しいサイズに合わせて自動的にサイズ変更されます。

ツールバーがアプリケーションのメインフォームにドッキングされて初めて表示されるときにツールバーのサイズが間違っていることを除いて、正常に機能します。その時点でツールバーのサイズを強制的に変更すると(たとえば、マウスクリックからTPanelの高さを明示的にサイズ変更することにより)、正しくなります。ルーチンを呼び出してサイズを2回設定し、Update、Application.ProcessMessages、ReAlignを呼び出してみました。メインフォームをペイントしてから、手動でサイズ変更を再度実行する以外は何も機能しないようです。

サイズ変更ルーチンの最後で中断してパネルサイズとフレームサイズを調べると、それらは正しいですが、ツールバーサイズが正しくないため、最初に表示されるときに、フレームが間違ったサイズのツールバーに部分的に表示されます。これは、サイジングルーチンへの別の呼び出しの直後に発生しますが、メインフォームがそれ自体をペイントした後でのみ発生します。

タイマーの期限が切れた後にパネルのサイズを明示的に変更するなど、厄介なことをやっつけてもかまいませんが、問題の原因を解決したいと思います。

なぜこれが起こっている(または起こっていない)のかについてのアイデアはありますか?

4

2 に答える 2

1

まあ、これは根本的な問題を解決していませんが、迅速な解決策になる可能性があります。フォームが表示される前にバーを1回フローティングすると、すべてのコントロールの配置を計算するように強制され、ドッキングすると、ドックに同じことを強制されます。このような:

procedure TForm1.FormCreate(Sender: TObject);
begin

  // Insert frame to toolbar, etc..

  TBToolbar.Floating := True;
  TBToolbar.CurrentDock := TBDock;
于 2010-10-03T23:03:33.703 に答える
1

歯ぎしりをした後、これを解決しました。この問題は、Control.Font.Height に割り当てたときに、コントロールとコントロールの Canvas の Font プロパティがすぐに整列しないという事実に起因していました。フレーム内のパネルの高さを計算するコードの一部は、割り当てた後にフォントの高さを使用しました。追加する必要がありました:

RequiredValueFontHeight   := blah blah..  ;
FFrame.ALabel.Font.Height := RequiredValueFontHeight ;
FFrame.ALabel.Canvas.Font := FFrame.ALabel.Font ;    //  I needed to add this line

Panel.Height              := RequiredValueFontHeight + Panel.Padding.Top + Panel.Padding.Bottom ; 

とにかくあなたの関心と助けに感謝します.

(回答とコメントが投票された理由..まあ、私はいい人だからです。)

于 2010-10-11T03:32:15.777 に答える