`

form打开时的关闭代码

阅读更多

 

 

摘自:http://topic.csdn.net/t/20030917/09/2268057.html

 

问题描述:

 

动态创建form常碰到一个问题就是必须在创建之前判断form是否已经存在,通常第一次创建的时候form肯定为nil,但是当使用完毕之后如果

 

form.free后,form肯定不是nil,必须在form关闭之后在他的主调用form中动态freeandnil(form),或者form.free;form.nil;才能变成nil 

我想知道有没有办法当form.free之后,form指针并不是nil的时候来判断form是否已经被free过了,是否能够正常创建一个新的对象。 

这个问题困扰了很久了!

 

 

 

个人感觉楼上各位的方法根本没有针对楼主的问题啊! 

 

当申明一个Form1的时候,只是在栈上创建一个四个字节的内存空间。直到调用构造器的时候才真正跑到堆上分配对象实际内存空间,也只有到了这个

 

时候,前面分配的四个字节的对象指针的内容才有意义! 

 

当我们释放了Form1的时候,如果不释放栈上的对象指针,就会形成一个野指针,如果对野指针进行操作,马上就会出现一个AV访问错误....楼主的意

 

思,我想就是在不释放对象指针的情况下去判断当前对象指针指向的对象是否还存在!个人认为没有任何现成的方法可以进行这种判断! 

 

如果使用Release、Free或Action:=caFree等方法将窗体释放掉后,此时窗体指针内容并不改变,这个时候用Assigned来判断虽然也可以判断窗体对

 

象指针有意义,但实际窗体是根本不存在的!

 

FrameSniper兄,我想知道的就是这个,难道没有任何办法可以判断一个指针的地址是否真的有效吗?经常碰到这个问题,通常都要很严格的控制一个

 

指针free后必须nil,或者读取指针的某一个属性来判断有效性,感觉这个办法很笨,感觉肯定有一些好的办法,等到这个问题解决了在接贴吧!

 

 

注明:

代码例子如下:

有form1,form2 ,form1打开form2,关闭form2的时候,不释放对象,即不执行Release,那么如下代码,在第2次打开form2的时候,会报错;

 

  if   assigned(form2) then

  begin

       // form2.Free;   //--如果form2已经被release后,这步就会报内存访问错误了;

       form2 := nil; //--如果没有第一步的free,则将指针置空后,那对象还在堆里,没有被释放掉;

  end;

 

 

 if not  Assigned(Application.FindComponent( 'Form2'))   then

    begin 

        Form2   :=   TForm2.Create(Application); 

    end; 

    Form2.Show; 

 

-------------------------------------------------------------

 

正确例子应该是这样:

form2关闭时,要执行release,释放掉对象;

然后在打开form2的时候,以下代码就可以了;

 if not  Assigned(Application.FindComponent( 'Form2'))   then

    begin 

        Form2   :=   TForm2.Create(Application); 

    end; 

    Form2.Show;

分享到:
评论

相关推荐

    Form窗口淡入淡出效果源代码(重叠透明)

    这个程序实现.net中form窗口的淡入淡出效果,实现语言是C#,在窗口弹出/打开和关闭的时候,就会实现这种淡入淡出的效果。另外,如果,最小化、恢复,或者失去焦点、得到焦点的时候,都会以半透明等方式出现。

    vb程序设计--IE浏览器程序代码.docx

    IE浏览器程序代码 新建窗口:用于打开一个新的窗口 Private Sub xinjian_Click() Dim a As Form Set a = New Form1 a.Visible = True End Sub 打开:打开电脑内的网页或打开所输入的网站 新建一个form2,添加Common...

    C#串口通信,包括打开串口,接收发送数据

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } SerialPort port1 = new SerialPort(); string InputData = String.Empty;... delegate void SetTextCallback...资源中部分代码

    网络文件下载程序-基于Java源代码.rar

    网络文件下载程序-基于Java的源代码,给定一个文件的网络URL地址,本程序将从该地址获取(下载)文件,java环境的手机,可直接运行本程序,具体代码:  in = (InputStream) Connector.openInputStream(url); //...

    如何在父窗口中得知window.open()出的子窗口关闭事件

    代码如下: <HTML> <BODY> <P> </P> <form name=fm_Info> <input type=text name=txtValue> </form> [removed] var timer var winOpen function IfWindowClosed() { if (winOpen....

    物业管理系统

    ‘,48,‘小区信息生成‘) thisform.release do form form小区信息登记 &&调入表单 case nAnswer=7 thisform.spinner1.setfocusendcase在“返回主系统”中的click事件中添加代码为:thisform.release &&释放表单(2)...

    FormLocation:允许您跟踪应用程序中所有表单的大小和位置,在每个表单中都需要跟踪两行代码。 下次打开该表单时,它会出现在您最后关闭该表单的位置,并调整大小为上一次出现的大小

    表格位置记录器 记录每个表单组件的窗口大小,位置和屏幕 允许您跟踪应用程序中所有表单的大小和位置,每个要跟踪的表单... 下次打开该表单时,它会出现在您上一次关闭该表单的位置,并且大小会与上次出现的大小相同。

    C# Winform中实现主窗口打开登录窗口关闭的方法

    在使用C#进行Winform编程时,我们经常需要使用一个登录框来进行登录,一旦输入的用户名密码登录成功,这时登录窗口应该关闭,而且同时打开主程序窗口。该如何来实现呢? 乍一想,很简单啊,打开主窗口就用主窗口的...

    c# 加密和解密相关代码

    (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个GroupBox 容器控件,其中, 在第一个GroupBox 中放入3 个TextBox 控件和一个Button 按钮,分别用于输入数字、输入加密数字、显示加 密后的数字和...

    【delphi】Android系统状态广播消息感知控件及演示程序源代码(老吴)

    【delphi】Android系统状态广播消息感知控件及演示程序源代码,详细介绍了Android系统消息广播感知... 打开监听 FReceiver_State.Register_Reveiver(errmsg); //5. 关闭监听 FReceiver_State.UnRegister_Reveiver;

    《javaScrip开发技术大全》源代码

    第2章(\代码\第02章) • sample01.htm 将JavaScript代码插入在标签与标签之间 • sample02.htm 将JavaScript代码放在了标签与标签之间 • sample03.htm JavaScript与HTML混合执行 • ...

    javascript学习随笔(使用window和frame)的技巧

     打开和关闭窗口 当用户启动(launch)Navigator时,将自动创建一个窗口.用户还可以使用Navigator的File菜单上的New Web Browser打开一个窗口, 可以用Navigator的File菜单的Close或Exit关闭一个窗口.也可以用程序的...

    C#串口实例 源代码

    btn.Text = "关闭端口"; } catch { MessageBox.Show("打开端口失败,请检查端口是否被占用."); } } else { this.serialPort1.Close(); btn.Text = "打开端口"; } } private void Form1_FormClosing...

    三种方法让Response.Redirect在新窗口打开

    Response.Rederect在默认情况下是在本页跳转,所以除了在js中用window.open或是给A标签添加target属性之外,...代码如下: 代码如下: protected void Page_Load(object sender, EventArgs e) { form1.Target = “_blan

    在同步代码结束后,使用ReleaseMutex(THandle

    如果打开速度慢,可以尝试快速版;如果想保存快照,可以添加到搜藏。 (百度和网页http://blog.csdn.net/mygodsos/archive/2008/10/19/3097921.aspx的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不...

    layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子

    使用layer实现登录弹框,登录成功以后关闭弹框,并调用父窗口方法。 1.界面如下: 2.login.html的界面主要代码: <div class=layer_form> <div class=form_item> 手机号码: <div class=form_item_input> <...

    73种网页设计最常用到的js代码

    73种网页常用js代码. 比如: 1、后退 前进 后退" onClick="history.go(-1)"> 前进" onClick="history.go( 1 );return true;"> 2、返回 <form>返回上一步" onClick="history.back(-1)"></form> 3、查看源码 ...

    用c#编译一个windows程序

    这就是Form1对应的C#文件,双击它就可以对Form1进行界面设计,鼠标右键单击Form1.cs在弹出菜单中选择View Code便可以查看对应的代码。  D区是属性窗口:类似我们在VC6中资源编辑器里的属性窗口,但功能更强大,...

    PHP中用mysqli面向对象打开连接关闭mysql数据库的方法

    代码如下: <meta http-equiv=content-type content=text/html charset=utf-8/> 用mysqli面向对象方法连接数据库!-姚远的博客 <form method=POST action=<?php echo htmlspecialchars($_SERVER['...

    Vb6.0 实现窗口标题栏一闪一闪特效.rar

     If WindowState = 1 Then '窗体最小化时,打开计时器,闪烁窗体  Timer1.Enabled = True  Else '否则关闭计时器  Timer1.Enabled = False  End If  End Sub  Private Sub Timer1_Timer() '计时器事件  Call...

Global site tag (gtag.js) - Google Analytics