#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
. Но это не работает.