德尔福莫代尔表格的位置

时间:2011-05-13 15:59:45

标签: delphi forms

我有一张正由另一种表格打开的表格。

我将Position设置为poOwnerFormCenter,以便在原始位置打开新表单

然而,当我移动这个新表格然后回到原始表格时,它显示了我第一次打开新表格时的位置,而不是我关闭它的地方

我该如何解决这个问题?

谢谢!

3 个答案:

答案 0 :(得分:2)

我对你的问题感到有些困惑所以我会澄清我在这里要解决的问题!...

我认为你要做的是

当Form2打开时,它位于Form1的中央,而Form1被隐藏。

当Form2关闭时,会显示Form1(确切地说是隐藏的位置)。

我认为你想做的是Form1 Show Form2已关闭。

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

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

并且您期望Form2更新form1的位置,因为您将Form2的位置设置为poOwnerFormCenter

如果我猜对了,那么当Form2关闭时你需要做的就是更新Form1的位置

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

答案 1 :(得分:1)

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

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

因为每次显示时都会创建TForm2类的新实例,并在表单关闭时将其销毁,所以位置会发生变化;实际上,新的TForm2对象不可能记住任何先前的TForm2对象的位置。它们是两个不同的对象(是的,同一个类,但这无关紧要)!

最简单的解决方案是将TForm2添加到“项目选项”中的“自动创建表单”列表中。它默认存在,但如果您手动创建它(正如我认为的那样,以及上面的代码片段),您应该将其从自动创建的表单列表中删除...

IDE Screenshot http://privat.rejbrand.se/autocreateform.png

然后确保Unit1使用Unit2,以便您可以访问位于{Form2的{​​{1}}中的全局Unit2变量1}}。编辑Form1时,按Alt + F11执行此操作。

然后你可以通过

显示Unit1
Unit1

第一次显示时,它将尊重其Form2参数,并将其自身置于其所有者表单之上。但是它会记住它的位置,所以第二次显示它时,它会在第一次关闭时正确。

答案 2 :(得分:1)

问题是您正在重用模态表单的相同实例。设置位置仅在您第一次显示表单时起作用。你必须在这里选择:

选项1

每次关闭时都可以销毁模态表单。其中一种方法是在OnClose形式的事件中使用此行:

Action = caFree;

当然,这意味着您每次都必须从调用者重新创建模式形式。

选项2

您必须在OnShow事件上手动设置模态表单的位置。

使用最适合您的选项。