【问题标题】:Delphi XE3 form Open and CloseDelphi XE3 窗体打开和关闭
【发布时间】:2013-01-03 03:59:38
【问题描述】:

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

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

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

非常感谢..它必须是我忽略的一些简单的东西。

s

【问题讨论】:

  • 没有看到你在Form2(和Form1)中有什么样的代码,很难理解问题可能是什么。

标签: forms delphi


【解决方案1】:

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

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

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

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

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

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

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

caFree 导致表单在自身上调用Release()。见上文。

Form2.closemodal - 没有效果..

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

【讨论】:

    【解决方案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;
    

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

    【讨论】:

    • 好的我把上面的代码放在form1的按钮中打开form2..在form2按钮我把Form2.close;这又给了访问冲突......
    • 不要调用close,上面的代码就是你在模态状态下显示表单所需要的全部内容。
    • 好吧,我只是使用borderIcon..但是可以用Tbutton来完成吗?
    • 将按钮的ModalResult 设置为非零值。或者使用模态TForm 的按钮OnClick events to set the ModalResult`。这两种方法都会导致ShowModal() 退出。
    • @Sardukar - 请accept 解决您的问题的答案。
    【解决方案3】:
    //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
    

    //示例 //执行 //使用主要; 程序 Button1Click(Sender: TObject); 变量 F:TForm2; // 调用或显示所需的表单 开始 F:= TForm2.Create(nil); 尝试 F.左:=左+120; //所需表单的左侧位置 F.顶部:=顶部+300; //所需表单的顶部位置 F.ShowModal; 最后 F.免费; 结尾; 结束;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多