GridPanel не корректирует сначала изменение размера - PullRequest
6 голосов
/ 14 мая 2009

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

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

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

Заранее спасибо за помощь,

Мариуш.

Ответы [ 5 ]

9 голосов
/ 14 мая 2009

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

3 голосов
/ 02 октября 2014

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

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

procedure TForm1.FormResize(Sender: TObject);
begin
  GridPanel1.ControlCollection.BeginUpdate;
  GridPanel1.ControlCollection.EndUpdate;
end; 
3 голосов
/ 02 сентября 2009

Я нашел один трюк.

in 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; 
1 голос
/ 14 мая 2009

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

0 голосов
/ 14 мая 2009

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

...