Проблема с размером Toolbar2000 со встроенным фреймом

У меня есть панели инструментов Джордана Рассела 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 - похоже, ничего не работает, кроме как позволить основной форме рисовать, а затем снова выполнить изменение размера вручную.

Если я прервусь в конце процедуры изменения размера и проверю размер панели и размер кадра, они будут правильными, но размер панели инструментов — нет, поэтому при первом отображении кадр частично отображается на панели инструментов неправильного размера. Он появляется сразу после очередного вызова процедуры изменения размера, но только после того, как основная форма нарисовала себя.

Я мог бы придумать что-нибудь неприятное, например, явно изменить размер панелей после истечения таймера, но я бы предпочел решить проблему в ее источнике.

Любые идеи относительно того, почему это может происходить (или не происходить)?


person rossmcm    schedule 03.10.2010    source источник


Ответы (2)


Ну, это не решает проблему в ее источнике, но может быть быстрым решением. Однократное плавание панели перед отображением формы заставит ее вычислить все выравнивание элементов управления, а ее стыковка заставит док-станцию ​​сделать то же самое. Нравится:

procedure TForm1.FormCreate(Sender: TObject);
begin

  // Insert frame to toolbar, etc..

  TBToolbar.Floating := True;
  TBToolbar.CurrentDock := TBDock;
person Sertac Akyuz    schedule 03.10.2010

После долгого скрежета зубов я решил это. Проблема возникла из-за того, что свойства Font элемента управления и Canvas элемента управления не сразу выравниваются при назначении 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 ; 

Спасибо за ваш интерес и помощь в любом случае.

(ответы и комментарии проголосовали, потому что... ну, потому что я хороший парень.)

person rossmcm    schedule 11.10.2010
comment
ИМХО, вы должны принять свой собственный ответ, поскольку в моем посте речь идет об обходном пути, а не о решении. :) - person Sertac Akyuz; 11.10.2010