GridPanel не корректируется при первом изменении размера

StackOverflow https://stackoverflow.com/questions/862146

Вопрос

У меня есть проблема, которую я не могу решить, хотя трачу на это много времени.

Обычно я использую GridPanels для выравнивания элементов управления в формах.Однако у него есть досадная ошибка.Когда режим выравнивания GridPanel — alClient, и я максимизирую его родительское окно, GridPanel подстраивается под новый размер этого окна, однако элементы управления, лежащие в сетке, этого не делают.Они остаются в том же положении, в котором находились до изменения размера окна.Это происходит только при максимизации первого окна.Если размер окна сначала изменяется вручную, все в порядке.Я думаю, что сетка корректирует свои дочерние элементы управления после второго события изменения размера (??).

Что делать, чтобы GridPanel работал правильно, если возникла эта ошибка?Возможно, достаточно будет отправить ему сообщение (но какое сообщение?), я не знаю.Я пробовал использовать Realign, Refresh и т. д., но они не помогли.

Заранее благодарны за Вашу помощь,

Мариуш.

Это было полезно?

Решение

Ох, у меня тоже были подобные проблемы.Это может быть связано с проблемой изменения размера в VCL.Возможно, вы захотите попробовать исправление Андреаса Хаусладена.Кажется, это работает для меня в большинстве случаев.

Другие советы

Я нашел одну хитрость.

в OnResize событие родителя GridPanel, измените ширину GridPanel на 1 пиксель.

тогда GridPanel заметит изменение размера, а затем переупорядочит подэлементы управления в GridPanel.

образец ниже..

procedure TForm1.FormResize(Sender: TObject);
begin
  GridPanel1.Width := GridPanel1.Width - 1;  // subtract 1
  GridPanel1.Width := GridPanel1.Width + 1;  // recover width by adding 1
end; 

Изменение ширины/аннулирование элемента управления у меня не работает (что-то изменилось в последних версиях RAD Studio?).

В любом случае, аналогичный простой обходной путь в этом направлении:

procedure TForm1.FormResize(Sender: TObject);
begin
  GridPanel1.ControlCollection.BeginUpdate;
  GridPanel1.ControlCollection.EndUpdate;
end; 

У меня тоже была эта ошибка в нескольких проектах.Я не уверен, как я это решил (это было в проектах моего предыдущего работодателя, у меня больше нет доступа к этому исходному коду).Я думаю, мне пришлось перерисовать/обновить родительский фрейм или форму, в которой была размещена GridPanel.

при изменении размера владельца вызовите GridPanel.Invalidate.Я не проверял это.Надеюсь, это работа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top