Delphi模态窗口位置

4

我有一个表单是由另一个表单打开的。

我将位置设置为poOwnerFormCenter,以便在原来的位置打开新表单。

但是,当我移动这个新表单然后返回原始表单时,它显示在我第一次打开新表单时的位置上,而不是关闭时的位置。

该怎么解决呢?

谢谢!

3个回答

2

我对你的问题有点困惑,所以我会澄清一下我在这里要解决的问题!...

我认为你想做的是

当Form2打开时,它位于Form1的中心位置并隐藏Form1。

当Form2关闭时,Form1显示(恰好在隐藏的位置)。

我认为你想要的是让Form1在Form2关闭后显示在Form2的位置。

所以我猜你有一些代码像...

procedure TForm1.ButtonClick(Sender: TObject);
begin
  Form2.ShowModal;
end;

如果你设置了Form2的位置为poOwnerFormCenter,并希望它更新Form1的位置,那么你需要做的就是在Form2关闭时更新Form1的位置。

procedure TForm1.ButtonClick(Sender: TObject);
begin
  Form2.ShowModal;
  Left := Form2.Left;
  Top := Form2.Top;
end;

1

我猜这是因为每次显示表单时都重新创建了它。也就是说,你做了这个:

with TForm2.Create(nil) do
  try
    ShowModal;
  finally
    Free;
  end;

因为每次显示时都会创建一个新的 TForm2 类实例,并在窗体关闭时销毁它,所以位置会发生变化;事实上,新的 TForm2 对象不可能记住任何先前 TForm2 对象的位置。它们是两个不同的对象(是的,同一类,但这并不重要)!
最简单的解决方案是将 TForm2 添加到项目选项中的“自动创建表单”列表中。默认情况下已经存在,但如果您手动创建它(就像我认为您正在做的那样,并且如上面的代码片段中所示),则应该从自动创建的表单列表中删除它...

IDE Screenshot

然后,您确保Unit1使用Unit2,以便您可以从Unit1中的Form1访问Unit2中的全局Form2变量。在编辑Unit1时,按Alt+F11即可实现。

然后,您只需执行以下操作即可显示Form2

Form2.ShowModal;

第一次显示它时,它将遵循其Position参数,并在其所有者表单上方定位。但是,它会记住自己的位置,因此第二次显示它时,它将出现在第一次关闭时的位置。


感谢您的出色回答,但它并不完全符合我的要求。当我首次打开原始表单并移动它,然后打开Form2时,它会在正确的位置打开。然而,当我移动Form2并返回到Form1时,它不是定位在Form2关闭的位置,而是在Form2首次打开的位置。我已经在Form1中访问了Form2并使用ShowModal,并将其添加到自动创建的表单中,但问题仍然存在。 - KingKong
@KingKong:是因为我的猜测错了,还是因为你不想每次都使用同一个对象? - Andreas Rejbrand
@ Andreas 对不起之前回答那么简短,我总是忘记按回车键会发布评论。 - KingKong
@KingKong 我也经常忘记按回车键发布评论 :( - user741875

1
问题在于您正在重复使用模态表单的同一实例。仅在第一次显示表单时设置位置才有效。您有两个选择:
选项1
每次关闭表单时都可以销毁模态表单。其中一种方法是在表单的OnClose事件中添加以下行:
Action = caFree;

当然,这意味着你还要每次从调用者重新创建模态表单。

选项2

你需要在OnShow事件中手动设置模态表单的位置。

使用最适合你的选项。


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