Проблема с размером Toolbar2000 со встроенной рамой - PullRequest
0 голосов
/ 04 октября 2010

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

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

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

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

Ответы [ 2 ]

1 голос
/ 11 октября 2010

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

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

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

1 голос
/ 04 октября 2010

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

procedure TForm1.FormCreate(Sender: TObject);
begin

  // Insert frame to toolbar, etc..

  TBToolbar.Floating := True;
  TBToolbar.CurrentDock := TBDock;
...