【发布时间】:2017-06-14 01:56:07
【问题描述】:
我的程序使用动态创建的框架,有时我会遇到控件对齐不正确的问题。
我使用自己继承自TPanel的容器控件,但使用GridPanel时也会发现同样的问题。
这里是重现问题的test 程序的源代码(带有已编译的 exe)。
关键码sn-ps:
在主窗体中:
//creating Frame from the main form
procedure TForm1.FormCreate(Sender: TObject);
begin
f := TFrame2.Create(Self);
f.Parent := Self;
end;
在框架中:
//constructor of the Frame
constructor TFrame2.Create(AOwner: TComponent);
begin
inherited;
Edit1.Clear;// the problem appears
end;
框架及其所有控件已对齐,并且必须具有主窗体的宽度,但 Edit1 和 ComboBox1 在您手动调整窗体大小之前不会在视觉上对齐(发送 WM_SIZE 无效)。
但是,如果您评论 Edit1.Clear 行,从程序开始一切都会正常工作。此代码并非特定于错误,您可以在此处输入,例如ComboBox1.Items.Add('')等
如果框架是静态创建的或将GridPanel 更改为Panel,问题就会消失。
感谢@quasoft,我制作了一个新的test2 版本,它工作得更好 - 现在控件水平对齐正确但垂直组合框不在正确的位置,可以通过更改表单大小看到。
【问题讨论】:
-
如果您只是将
Edit1.Clear替换为Edit1.Text := '',它会按预期工作 -
我看到你的项目,一切都很好,正如@quasoft 所说,只需替换
Edit1.Clear; -
“如果框架是静态创建的” 在两种情况下(静态和动态)检查框架的
WindowHandle中的TFrame2.Create。您可能希望在 FrameCreateWnd处理程序中初始化“依赖于句柄”的控件,您知道这些控件具有有效的窗口句柄。 (我现在无法测试)。 -
是的,静态创建的框架没有对齐问题。对于动态创建的帧,我使用 HandleAllocated 和 HandleNeeded 函数来确保句柄有效(例如,在发送消息时)。这还不够吗?