GridPanel在首次调整大小时不会自适应。

8

我有一个问题,尽管我花了很长时间去解决它,但我仍然无法解决它。

我通常使用GridPanels来对表单上的控件进行对齐。然而,它有一个非常烦人的bug。当GridPanel的对齐模式为alClient并且我最大化其父窗口时,GridPanel会调整到该窗口的新大小,但是放置在网格上的控件不会。它们保持在窗口调整大小之前的相同位置。 这仅发生在第一次窗口最大化时。如果首先手动调整窗口大小,则一切正常。我认为网格在第二次调整大小事件后调整其子控件(??)。

如何让GridPanel正常工作以解决此错误?可能只需向其发送一条消息(但是什么消息?),我不知道。我尝试使用Realign、Refresh等,但它们没有帮助。

提前感谢您的帮助,

Mariusz。


当GridPanel对齐到顶部时,这种情况是否也会发生? - Gabriel
5个回答

9

啊,我也遇到过类似的问题。这可能与VCL中的调整大小问题有关。您可以尝试Andreas Hausladen的修复方法。在大多数情况下,它对我有效。


这个Andreas Hausladen真是太棒了! - Gabriel

5

改变宽度/使控件失效并不适用于我(最近版本的RAD Studio发生了一些变化?)。

无论如何,一个类似的简单解决方案是:

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

我在 Delphi XE7 上也遇到了同样的问题,你的解决方案有效。 - Fabrizio

3

我发现一个技巧。

在gridpanel的父元素的OnResize事件中,将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

我也遇到过这个错误,在几个项目中都出现过。我不确定我是如何解决的(这是在我之前的雇主的项目上,我现在无法访问这个源代码)。我想我需要重新绘制/刷新包含GridPanel的父框架或表单。


-1
在所有者调整大小时调用GridPanel.Invalidate。 我没有测试它。希望它能工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接