Панель управления.Автоматическое изменение размера не работает в конкретной ситуации

#delphi #autosize #delphi-10.4-sydney #tpanel

Вопрос:

В приложении Delphi 10.4.2 Win32 VCL в Windows 10 я использую TPanel с AutoSize = True .

В документации говорится:

Если значение AutoSize равно True, размер элемента управления автоматически изменяется при изменении его содержимого.

Однако это не тот случай, когда размер его содержимого изменяется во время выполнения в данной конкретной ситуации:

Поместите эти элементы управления в форму заявки VCL:

 object Button1: TButton
  Left = 40
  Top = 56
  Width = 81
  Height = 25
  Caption = 'Button1'
  TabOrder = 2
  OnClick = Button1Click
end
object Panel1: TPanel
  Left = 40
  Top = 104
  Width = 161
  Height = 19
  AutoSize = True
  TabOrder = 1
  object CheckBox1: TCheckBox
    Left = 1
    Top = 1
    Width = 159
    Height = 17
    Align = alTop
    Caption = 'bla bla bla bla bla bla'
    TabOrder = 0
    WordWrap = True
  end
end
 

Затем в обработчике кнопки OnClick поместите этот код:

 procedure TForm1.Button1Click(Sender: TObject);
begin
  Panel1.AutoSize := False;
  try
    Panel1.Width := Panel1.Width - 10;
  finally
    Panel1.AutoSize := True; // trying to refresh the Panel's height
  end;
end;
 

Это каждый раз уменьшает ширину панели на 10 пикселей.

Однако высота панели не изменяется автоматически!

Как я могу вручную изменить размер панели, чтобы она отражала измененную высоту флажка?

Комментарии:

1. Основная проблема довольно проста. Чтобы понять это, создайте новый проект VCL и поместите a TCheckBox в основную форму. Установите его WordWrap на True и его Caption на 'A friendly dog ate a biscuit.' . Установите флажок достаточно широким, чтобы заголовок помещался в одной строке. Теперь в конструкторе форм уменьшите ширину флажка. Вы увидите, что, в конце концов, заголовок превращается в две строки, но высота элемента управления не меняется! Таким образом, текст будет усечен. Теперь, в вашем сценарии, поскольку флажок не увеличивает свою высоту, панель не имеет новой оптимальной высоты для

2. (продолжение) … приспособьтесь. Таким образом, фактический вопрос заключается в следующем: «Как мне автоматически настроить высоту буквы а TCheckBox с помощью нескольких строк текста?»

3. Разве флажок не должен автоматически соответствовать своей высоте в тексте завернутой подписи? По-видимому, TCheckBox у него нет AutoSize собственности?

4. Нет, этот флажок известен тем, что у него нет функции автоматического изменения размера. Это часто вызывает проблемы при переводе программного обеспечения (скажем, с английского на шведский). Например, если изначально указан заголовок флажка 'Show old messages' , то перевод на шведский язык 'Visa gamla meddelanden' может быть усечен (а затем вам придется вернуться к DFM и расширить элемент управления).

5. Я попытался решить проблему с Interposer классом, в котором раскрывается защищенное AutoSize свойство TCheckBox . Но это не работает.