Forms Delphi XE3窗体打开和关闭

Forms Delphi XE3窗体打开和关闭,forms,delphi,Forms,Delphi,有人能帮我吗 我有中一和中二 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-access viololation或closes..如果我单

有人能帮我吗

我有中一和中二

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-access viololation或closes..如果我单击form1上的“打开”按钮重新打开表单,则会导致访问冲突
  • Form2.close+onClose动作:=cafree;-访问冲突
  • Form2.closemodal-无效
如何处理和重用form1中显示为模态的form2

非常感谢……一定是我忽略了一些简单的事情


首先,从自动创建中删除表单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

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;
如果希望它以非模态状态显示,而主窗体仍然可以访问,则必须以完全不同的方式执行。如果你需要,请告诉我,我会调整我的答案

form2.close=工作但不关闭,只是隐藏表单

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

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

从属于同一表单的事件处理程序内部释放表单是不安全的。事件处理程序退出后,VCL仍然需要访问表单对象。要安全地释放表单,必须改用
Release()
,这会通知表单在以后安全时自动释放自己

表格2。release-access viololation或closes..如果我单击form1上的“打开”按钮重新打开表单,则会导致访问冲突

Release()
导致AV的唯一方法是使用无效的表单指针调用AV。如果重新打开表单导致AV,则代码中存在一些严重错误

Form2.close+onClose动作:=cafree;-访问冲突

caFree
使窗体对自身调用
Release()
。见上文

Form2.closemodal-无效

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

//this script for showing Form through Button with position 
//change position by changing left or top by changing 120 and 300
//in Delphi 10.3 and above 
// add form2 unit name in main unit in implementation as uses
form2.close=工作但不关闭,只是隐藏表单

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

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

从属于同一表单的事件处理程序内部释放表单是不安全的。事件处理程序退出后,VCL仍然需要访问表单对象。要安全地释放表单,必须改用
Release()
,这会通知表单在以后安全时自动释放自己

表格2。release-access viololation或closes..如果我单击form1上的“打开”按钮重新打开表单,则会导致访问冲突

Release()
导致AV的唯一方法是使用无效的表单指针调用AV。如果重新打开表单导致AV,则代码中存在一些严重错误

Form2.close+onClose动作:=cafree;-访问冲突

caFree
使窗体对自身调用
Release()
。见上文

Form2.closemodal-无效

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

//this script for showing Form through Button with position 
//change position by changing left or top by changing 120 and 300
//in Delphi 10.3 and above 
// add form2 unit name in main unit in implementation as uses
//范例 //实施 //使用主; 程序按钮1点击(发送方:ToObject); 变量 F:TForm2;//呼叫或显示所需的形式 开始 F:=TForm2.Create(无); 尝试 F.左:=左+120//所需形状的左位置 F.顶部:=顶部+300//所需表格的顶部位置 F.showmodel; 最后 F.免费; 结束; 结束

//范例 //实施 //使用主; 程序按钮1点击(发送方:ToObject); 变量 F:TForm2;//呼叫或显示所需的形式 开始 F:=TForm2.Create(无); 尝试 F