我有一张正由另一种表格打开的表格。
我将Position设置为poOwnerFormCenter,以便在原始位置打开新表单
然而,当我移动这个新表格然后回到原始表格时,它显示了我第一次打开新表格时的位置,而不是我关闭它的地方
我该如何解决这个问题?
谢谢!
答案 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
事件上手动设置模态表单的位置。
使用最适合您的选项。