有人可以帮我解决这个问题:
我有表格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,从form1显示为modal?
感谢一大堆。我必须是一件简单的事情,我可以忽略。
取值
答案 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;