摘自: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;
分享到:
相关推荐
如果使用`ShowDialog()`, Form2将作为模态对话框打开,用户必须先关闭Form2才能继续与Form1交互。在这个场景中,我们可能选择`ShowDialog()`,因为通常希望在关闭Form2前阻止用户访问Form1。 3. **添加关闭事件处理...
本文将深入探讨如何在MDI环境中控制子窗体的显示与管理,特别是如何实现“在打开新子窗体时自动关闭当前存在的子窗体”的功能。 ### MDI基础概念 MDI架构的核心是`MDIForm`,即作为所有子窗体容器的主窗体。当一个...
4. **实现“打开一个窗体、就关闭一个窗体”**:这个需求可能意味着在打开新窗体时,希望关闭当前活动窗体。我们可以根据上下文选择合适的方式实现。以下是一个简单的例子: ```csharp private void OpenNewForm_...
在C#开发中,特别是在Windows Forms应用程序中,有时我们需要在用户执行某些操作后打开一个新的窗口(Form),同时关闭当前窗口。这种需求常见于登录验证、切换视图等场景。本文将详细介绍如何在C#中实现这一功能,...
在Devexpress中,我们可以监听XtraTabControl的MouseDoubleClick事件,以便在用户双击标签页时执行关闭操作。 下面是一段C#代码示例,演示了如何实现这个功能: ```csharp private void xtraTabControl1_...
6. **防止立即关闭**: 如果希望用户有一定时间进行操作而不是立即关闭对话框,可以在对话框加载时停止计时器,然后在需要的地方(如按钮点击事件)重新启动计时器。 7. **用户交互**: 如果对话框有用户输入或其他...
在Windows Forms应用开发中,经常需要在不同的窗体(Form)之间传递数据。这可能是为了在用户在不同界面间导航时保持...在编写代码时,应考虑到代码的可读性和维护性,避免过度耦合,确保应用程序的稳定性和可扩展性。
### 在VS2005中打开图片的代码详解 #### 一、概述 本文将详细介绍如何在Visual Studio 2005(简称VS2005)中编写一个简单的应用程序来打开并显示图像文件。本示例适用于初学者,通过实践可以加深对Windows Forms...
### C#中利用委托实现子窗口关闭时通知父窗口执行特定方法 在C#中,事件和委托是非常重要的概念,特别是在处理用户界面交互时。本文将详细介绍如何利用委托(Delegate)来实现在关闭子窗口时通知父窗口执行特定的...
`Show`会在当前窗体之上显示新窗体,而`ShowDialog`会创建一个模态对话框,直到关闭form2,form1才会继续执行。 2. **控件的访问**: 如果需要在form1中操作form2的控件,通常需要避免直接访问。这是因为在C#中,...
* 如果打开 folder 时出现错误:“Set_Item_Property 没有这样的属性”,说明 erp 标准程序中用到的属性在个别项中不存在,出现几次就有几个缺乏这个属性的 Item; * 是否拥有这个属性,是由 Item 的类型确定的,...
在.NET Framework中,尤其是使用C#进行Windows Forms开发时,我们常常需要在应用程序中实现打开新的窗体并关闭当前窗体的功能。这个问题在标题和描述中已经提及,这里将详细解释如何实现这一操作,并分享一个简洁的...
窗体可以包含各种控件,如按钮、文本框等,以及事件处理代码,当用户与这些控件交互时,代码会被执行。 关闭窗体的操作通常由用户的交互触发,比如点击关闭按钮,但也可能通过程序逻辑自动执行。在VB中,我们可以...
本教程将详细讲解如何通过Visual Studio VB源代码来实现对CD-ROM驱动器的打开和关闭操作,这对进一步学习VB.NET至关重要。 首先,我们需要了解Windows API(应用程序接口),这是VB与操作系统进行交互的关键。VB...
这段代码将阻塞Form1的执行,直到Form2被关闭。这就实现了模态对话框的效果。 **关闭窗体的两种常见方法:** 1. **关闭按钮**:大多数窗体都有一个默认的“关闭”按钮(右上角的X)。当用户点击这个按钮时,窗体会...
总的来说,"新打开窗口可拖动调整大小和关闭代码"这一知识点涵盖了Web开发和桌面应用程序设计的基础知识,包括DOM操作、事件处理、用户交互以及不同编程语言和框架的API使用。理解并掌握这些技能,对于任何从事UI...
- 运行未知的VBA宏可能引入病毒或恶意软件,因此在打开带有宏的工作簿时要谨慎。 通过学习这个实例,你可以掌握如何利用VBA宏来定制Excel环境,提高工作效率,并进一步探索VBA在办公自动化中的潜力。同时,了解并...
【标题】"wsl桌面打开程序源代码.zip"是一个压缩包,其中包含了使用VB(Visual Basic)编写的小程序源代码,用于在Windows Subsystem for Linux (WSL)环境下启动并控制桌面应用程序。从描述来看,这个程序有特定的...
4. **根据判断结果打开或关闭子窗体**: 当用户触发某个操作(如点击按钮)时,调用`IsChildFormOpen`方法检查子窗体状态。如果子窗体已打开,我们可以选择不执行任何操作或显示提示信息;如果未打开,我们就实例化...
3. **启动时登录**: 为了在启动FORM时直接登录Oracle数据库,可以在FORM的初始化过程中编写PL/SQL代码,连接到数据库。 4. **ODBC访问Access数据**: 若需通过FORM访问非Oracle数据源如Access,需要配置ODBC数据源,...