1

有人可以帮我弄这个吗:

我有表格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。释放 - 访问冲突或关闭..如果我单击 form1 上的打开按钮重新打开它会导致访问冲突..
  • Form2.close + onClose 动作 :=cafree; - 访问冲突..
  • Form2.closemodal - 没有效果..

如何处理和重用从 form1 显示为模态的 form2?

谢谢一堆..它必须是一些简单的我可以忽略的东西。

s

4

3 回答 3

3

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

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

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

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

表格 2。释放 - 访问冲突或关闭..如果我单击 form1 上的打开按钮重新打开它会导致访问冲突..

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

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

caFree导致表单调用Release()自身。看上面。

Form2.closemodal - 没有效果..

你不应该CloseModal()直接打电话。改为使用Close()或设置ModalResult

于 2013-01-03T05:17:02.660 回答
2

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

如果您希望它以非模态状态显示,而主窗体仍可访问,则必须以完全不同的方式完成。让我知道这是否是您需要的,我会调整我的答案。

于 2013-01-03T04:07:09.060 回答
0
//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

//例子 //实现 //使用main; 程序 Button1Click(Sender: TObject); 变量 F:TForm2;// 调用或显示的所需表单 begin F:= TForm2.Create(nil); 试试 F.Left :=left+120; //所需表格的左侧位置 F.Top :=top+300; //所需表单的顶部位置 F.ShowModal; 最后 F.Free; 结尾; 结尾;

于 2020-07-20T10:26:16.203 回答