Delphi XE6 TForm.AutoSize

У меня есть код в Delphi XE2, который отлично работает. Но в Delphi XE6 это не работает. Я создаю Tform со свойством AutoSize равным true. Я использую TPanel, выровняв alTop с кнопкой для создания других панелей.

procedure TForm2.Button1Click(Sender: TObject);
var
   t :TPanel;
begin
   t := TPanel.Create(self);
   t.Parent := self;
   t.Align := alTop;
end;

Форма не имеет автоматического размера. Если я хочу увидеть все свои панели, мне нужно переместить форму (или попытаться изменить размер, ....).

У вас есть идеи?


person Joc02    schedule 11.07.2014    source источник
comment
Кажется, работает нормально в XE5. Установка XE6 на мой ноутбук может занять некоторое время...   -  person LU RD    schedule 11.07.2014
comment
AutoSize -> Автоматическая настройка размера формы. alTop -> Автоматическая настройка размера панели. Бесполезно использовать оба, один из них должен иметь приоритет, который будет зависеть исключительно от деталей реализации.   -  person Sertac Akyuz    schedule 11.07.2014
comment
@SertacAkyuz Я не уверен - alTop делает больше, чем регулирует размер, он также позиционирует элементы управления.   -  person David Heffernan    schedule 11.07.2014
comment
@David - То, что он делает больше, не меняет того факта, что его размер автоматически изменяется, чтобы соответствовать его родителю.   -  person Sertac Akyuz    schedule 11.07.2014
comment
@SertacAkyuz Мне кажется, что AutoSize и Align должны работать вместе. Когда вы помещаете выровненные элементы управления в контейнер с автоматическим размером, размер элементов управления больше не изменяется. Элементы управления размещаются, а размер контейнера изменяется в соответствии с размером элементов управления. Не то, чтобы я мог найти какую-либо документацию на этот счет.   -  person David Heffernan    schedule 11.07.2014
comment
@David - неполная документация меня не удивит. Однако это не так просто реализовать. Рассмотрим панели alTop и alBottom с разной шириной... Результат все равно будет зависеть от деталей реализации.   -  person Sertac Akyuz    schedule 11.07.2014
comment
@SertacAkyuz Да, было бы.   -  person David Heffernan    schedule 11.07.2014


Ответы (2)


Это действительно изменение поведения. Я могу воспроизвести то, что вы сообщаете. А именно, что ваш код приводит к изменению размера формы в XE2, но не в XE6.

Чтобы обойти это, вы можете вручную вызвать AdjustSize:

procedure TForm1.Button1Click(Sender: TObject);
var
  Panel: TPanel;
begin
  Panel := TPanel.Create(self);
  Panel.Parent := Self;
  Panel.Top := ClientHeight;
  Panel.Align := alTop;
  AdjustSize;
end;
person David Heffernan    schedule 11.07.2014
comment
Panel.Parent := Self; запускает событие OnFormResize в XE5, но не в XE6. Я озадачен, почему было введено это изменение в поведении. - person LU RD; 11.07.2014

Не выравнивать, использовать якоря:

t.Anchors:=[TAnchorKind.akTop];

Это от моего XE5 (у меня нет XE6)

person LHristov    schedule 11.07.2014
comment
Обязательно расположите и измените размер панели там, где вы хотите, прежде чем привязать ее. - person Remy Lebeau; 11.07.2014