Delphi XE3表单打开和关闭

时间:2013-01-03 03:59:39

标签: forms delphi

有人可以帮我解决这个问题:

我有表格1和表格2

in form1 1 :use form2.
in form1 put a button with code Form2.Showmodal;
form2 is made invisible
form2 has one button:
  • form2.close =工作但不关闭只是隐藏表单。 -form2.free - 访问冲突或关闭,form1被冻结(taskmngr杀死它)
  • 窗体2。 release - acccess viololation或closing ..如果我单击form1上的打开按钮重新打开它提供访问冲突的表单..
  • Form2.close + onClose action:= cafree; - 访问违规..
  • Form2.closemodal - 无效..

如何处理和重用form2,从form1显示为modal?

感谢一大堆。我必须是一件简单的事情,我可以忽略。

取值

3 个答案:

答案 0 :(得分:3)

  

form2.close =有效但不关闭只是隐藏表单。

是的,它确实关闭了表单。这就是封闭形式的默认行为 - 隐藏自身。对于模态表单,Close()仅将表单的ModalResult设置为非零值,这会导致ShowModal()退出并关闭/隐藏表单。

  

form2.free - 访问冲突或关闭,form1被冻结(taskmngr杀死它)

Free()来自属于同一表单的事件处理程序内部的表单是不安全的。在事件处理程序退出后,VCL仍需要访问表单对象。为了安全地释放表单,您必须使用Release()来表示表单在以后安全的情况下自动释放自己。

  

窗体2。 release - acccess viololation或closing ..如果我单击form1上的打开按钮重新打开它提供访问冲突的表单..

Release()导致AV的唯一方法是使用无效的表单指针调用它。如果重新打开表单会导致AV,那么您的代码中就会出现一些严重的错误。

  

Form2.close + onClose action:= cafree; - 访问违规..

caFree会导致表单自行调用Release()。见上文。

  

Form2.closemodal - 没有效果..

您不应该直接致电CloseModal()。请使用Close()或设置ModalResult

答案 1 :(得分:2)

首先,从自动创建中删除表单2.

Project > Options > Forms 
Remove Form 2 from "Auto-create forms"

这可确保不会自动创建此表单。

创建它的实例时,请勿按名称引用它(例如Form2)。而是创建一个临时变量。如果要以模态状态显示它,请执行以下操作:

procedure Button1Click(Sender: TObject);
var
  F: TForm2;
begin
  F:= TForm2.Create(nil);
  try
    F.ShowModal;
  finally
    F.Free;
  end;
end;

请勿以您提供的任何名称来引用您的表单,例如Form2。如果您将其实例化为上面演示的另一个变量(使用F),那么请确保您对它所做的所有调用都是通过此变量进行的。事实上,只要您从自动创建的表单中删除此表单,您就可以完全删除此表单的声明:

var
  Form2: TForm2;

如果您希望它以非模态显示,而主窗体仍可访问,则必须完全不同。如果这就是你需要的,请告诉我,我会调整我的答案。

答案 2 :(得分:0)

//this script for showing Form through Button with position 
//change position by changing left or top by changing 120 and 300 
procedure Button1Click(Sender: TObject);
 var
 F: TForm2; // Desired Form for Calling or showing
begin
  F:= TForm2.Create(nil);
try 
  F.Left :=left+120; //Left position of Desired Form
  F.Top :=top+300; //Top position of Desired Form
   F.ShowModal;
finally
 F.Free;
  end;
end;