0

我有 Jordan Russel 的 Toolbar2000 工具栏,我在运行时使用嵌入式 TFrame 创建并停靠在应用程序主窗体上。该框架有一个嵌入式窗格,该窗格又包含其他面板和各种控件。所以结构是:

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 高度的大小),它就会正确。我尝试调用例程来设置大小两次,调用 Update、Application.ProcessMessages、ReAlign - 除了让主窗体绘制然后再次手动执行调整大小之外,似乎没有任何效果。

如果我在调整大小例程结束时中断并检查面板大小和框架大小,它们是正确的,但工具栏大小不正确,所以第一次显示时,框架部分显示在大小错误的工具栏中。它是在另一个大小调整例程调用之后出现的,但只有在主窗体自己绘制之后。

我可以拼凑一些讨厌的东西,比如在计时器到期后显式调整面板的大小,但我宁愿从源头解决问题。

关于为什么这可能发生(或不发生)的任何想法?

4

2 回答 2

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 时控件的字体属性和控件的画布的字体属性没有立即对齐。在我分配给它之后,计算框架内面板高度的部分代码使用了字体高度。我需要补充:

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 回答