`
wodamazi
  • 浏览: 1470056 次
文章分类
社区版块
存档分类
最新评论

Effective BCB Form Program(1) ——窗体事件驱动链引发程序错误分析

 
阅读更多

Effective BCB Form Program

——窗体事件驱动链引发程序错误分析

BCB中采用的类库是VCL,其编程框架是事件驱动的,类似于VB。我在开发过程中发现,如果不对BCB的事件驱动链进行分析,写的程序会带有很多的错误,健壮性很成问题,而且调试很麻烦。

我发现程序中的很多错误都来源于C++的指针操作。在程序中用new的方法创建了一个对象,然后delete这个对象之后,如果此时还有其它指针指向这个对象,访问此对象信息的代码必定会引发异常。这在C++中是常识性的问题。但这个问题在BCB这类事件驱动的开发环境中就复杂化了。由于事件模型其实是对Windows消息循环机制的一个封装,而Windows中一个消息可能会引发一连串的其他消息,所以,事件之间也是相互引发的,形成一个事件驱动的链条。

BCB这类RAD的开发环境中,窗体(Form)是最核心的组件,窗体的事件模型也是程序中最需要分析的。

我在BCB5中设计了几种典型情况,针对BCB提供的事件模型,绘出了BCB中的事件驱动链。由于WM_PAINT消息的反复激发,所以我有意识地屏蔽掉了对这一消息的响应事件OnPaint。我发现大多数错误就发生成窗体的生成与销毁过程中,其主要的原因就是程序员选错了事件,将代码放错了地方。所以,我重点分析了工程中窗体的创建和销毁过程中的事件驱动链。

先对BCB的工程文件(BPR)进行分析:

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize();

Application->CreateForm(__classid(TForm1), &Form1);

Application->Run();

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

return 0;

}

WinMainBCB工程的入口点,Initialize()一句完成程序的初始化工作,CreateForm()一句完成窗体的创建工作(在此引发一系列的事件),Run()一句则进入了消息循环,此时事件主要是用户操作引发的(当然也有定时器等操作系统引发的事件)。

Catch()一句保证应用程序不会引起操作系统的崩溃。但这也是无数的BCBDelphi程序会引发“XXX内存读写错误”信息的根源所在。正是为了提高BCB程序的健壮性,我才进行了这个实验,其中比较枯燥,不想看记录的人可以直接去看结论部分。

实验记录:

一、由BCB自动创建的Form的事件驱动链

实验一. 工程中只有一个主窗体Form1

当窗体中只有一个主窗体(Form1)时,程序运行事件的发生次序如下:

创建

Form1构造函数àOnCreate() //到此窗体创建完毕,以下进入窗体的显示过程

àOnShow()àOnActivate()àOnCanResize()àOnConstrainedResize()àOnResize()

窗体显示完毕,以下进入消息循环,等待用户输入.

关闭

关闭主窗体Form1:

OnCloseQuery()àOnClose() //到此退出消息循环

àOnHide()àOnDestory()à~Form1()析构函数

显然,一个窗体要先隐藏,再销毁,最后再调用析构函数

另外:OnShow()à……àOnResize()这一事件链在各种情况中始终不变,下面的记录中我就以……代表这些不变的事件链。

实验二:工程中有两个窗体,Form1为主窗体,Form2为普通窗体

当工程中有两个窗体,Form1为主窗体,Form2为普通窗体,事件链如下:

创建

Form1构造函数à OnCreate() //到此窗体Form1创建完毕,开始创建Form2

à Form2构造函数

//以下进入Form1的显示过程

àOnShow()à……àOnResize()

除非在代码中指定,缺省情况下Form2只处于加载状态,不会显示,Form2中的OnCreate()等事件代码不会运行。

关闭

关闭时,Form2处于隐藏或显示状态均一样:

Form1OnCloseQuery()àOnClose() //到此退出工程消息循环,以下销毁Form2

àForm2析构函数àForm1 OnHide()àForm1OnDestory()à~Form1()析构函数

值得注意的是,这时,Form2OnDestory()没有被执行,对应地,当它创建时,Form2OnCreate()也没有执行!

实验三:工程中有两个窗体,Form1为主窗体,Form2继承自Form1

BCB中,可以很方便地继承某个窗体,这是BCB的一个非常好用的功能。

创建

Form1构造函数à OnCreate() //到此窗体Form1创建完毕,开始创建Form2

àForm2OnCreate()àForm1的构造函数àForm2的构造函数 //以下进入Form1的显示过程,同单窗体工程一样àOnShow()à……àOnResize()

值得注意的是:Form2OnCreate()函数居然先于Form2的构造函数运行!

关闭

1Form2为隐藏状态,

Form1OnCloseQuery()àOnClose() //到此退出工程消息循环,以下销毁Form2

àForm2析构函数àForm1的析构函数àForm2OnDestory()àForm1 OnHide()àForm1OnDestory()àForm1的析构函数

注意:Form1的析构函数被执行了两次!

2Form2为显示状态

Form1OnCloseQuery()àOnClose() //到此退出工程消息循环,以下销毁Form2

àForm2OnHide()àForm2的析构函数à Form1的析构函数à Form2OnDestory()àForm1 OnHide()àForm1OnDestory()àForm1的析构函数

注意:Form1的析构函数被执行了两次!

两种情况对比,可以发现只多了一个Form2的隐藏过程.

分享到:
评论

相关推荐

    BCB程序设计范例——中国象棋

    标题中的“BCB程序设计范例——中国象棋”指的是使用Borland C++ Builder(BCB)这一集成开发环境进行程序设计的一个实例,具体应用是开发一款中国象棋游戏。BCB是一款基于C++的可视化开发工具,它集成了IDE、编译器...

    BCB 阻止打开重复窗体

    在探讨“BCB阻止打开重复窗体”的主题时,我们首先需要理解BCB(Borland C++ Builder)是一款由Borland公司开发的集成开发环境(IDE),主要用于Windows平台上的C++应用程序开发。它提供了丰富的图形用户界面(GUI)设计...

    bcb窗体设计源程序

    "bcb窗体设计源程序"是这个主题的一个实例,适合C++ Builder的新手学习如何构建和设计用户界面(UI)。 窗体设计是开发应用程序时的重要组成部分,它涉及到了用户与软件交互的界面布局。在C++ Builder 6.0中,...

    DLL中的窗体和主程序进行交互显示信息

    窗体(Form)是用户界面的主要组件,包含各种控件和事件处理代码。窗体类应定义为`TForm`的子类,并在DLL的接口部分(`interface`段)声明,以便主程序可以访问。 3. **暴露窗体**:为了让主程序能够显示和操作DLL...

    BCB 图形图像窗体

    在C++ Builder 6(BCB)开发环境中,创建自定义形状窗体和处理图形图像是一项常见的任务,尤其对于设计用户界面(UI)时。BCB 提供了强大的VCL(Visual Component Library)库,使得开发者能够轻松地构建具有丰富...

    BCB 窗体与控件应用基础

    【BCB 窗体与控件应用基础】是C++ Builder 6程序设计中的重要章节,主要涉及事件驱动编程和各种控件的使用。事件驱动编程是一种编程模型,其中程序响应用户或系统的各种事件来执行特定的操作。在这个模型中,程序会...

    提取Delphi(BCB)编译的exe中窗体的例子

    在Delphi和BCB中,窗体(Forms)是用户界面的基础元素,通常保存为*.dfm(Delphi Form)文件。这些文件包含了窗体布局、控件位置、属性设置等所有UI相关的详细信息。在编译过程中,这些*.dfm文件会被嵌入到最终的exe...

    bcb6做的特效窗体及图片切换示例

    【标题】"bcb6做的特效窗体及图片切换示例"主要展示了使用Borland C++ Builder 6(简称bcb6)开发的一种具有视觉特效的窗体应用,其中包括了图片的动态切换功能。Borland C++ Builder 6是一款集成开发环境,特别适合...

    BCB——学生信息查询

    3. **事件驱动编程**:BCB采用事件驱动编程模型,用户界面的每个控件(如按钮、文本框)都可以绑定事件处理器。比如,点击查询按钮时触发一个事件,执行对应的SQL查询语句。 4. **用户界面设计**:BCB提供了一个...

    系统与窗体BCB源代码

    【系统与窗体BCB源代码】是一组基于Borland C++ Builder(BCB)开发的源代码,主要涉及了系统信息获取、任务栏编程、操作系统注册表操作、窗体设计以及状态栏编程等多个核心知识点。这些源代码是学习和理解BCB编程...

    BCB-program7.rar_The Program_bcb_pointer

    BCB的强大之处在于它的可视化设计界面和事件驱动编程模型,使得开发者能够便捷地创建用户界面和编写逻辑代码。 在这个项目中,“pointer”(指针)是一个关键概念。在C++中,指针是一个变量,其值为另一个变量的...

    C++BUILDER BCB透明窗体

    在C++Builder(BCB,Borland C++ Builder)中创建透明窗体是一项常见的需求,这主要涉及到Windows API和GDI(Graphics Device Interface)的知识。BCB提供了一个强大的环境来构建图形用户界面(GUI)应用程序,而...

    bcb串口mscomm控件程序编译运行错误修复工具集合c++builder

    标题中的“bcb串口mscomm控件程序编译运行错误修复工具集合c++builder”指的是一款专门针对C++Builder开发环境中的串口通信问题,特别是涉及到MSComm控件时遇到的编译和运行错误的修复工具集。C++Builder是Borland...

    BCB-program6.rar_There There

    【标题】"BCB-program6.rar_There There" 指的是一个使用 Borland C++ Builder(简称BCB)开发的程序集,其中包含了三个不同的功能模块:鼠标移动、光标移动以及标签显示。这个压缩包文件“BCB program6”可能是包含...

    BCB-program4.rar_OTSU_The Program

    【标题】:“BCB-program4.rar_OTSU_The Program” 涉及的主要知识点是图像处理中的Otsu阈值分割与边缘检测算法的应用,其中BCB(Borland C++ Builder)是一种集成开发环境,用于编写C++程序。 【描述】中提到的两...

    抽奖示例程序 BCB6

    1. **主窗体(Main Form)**:这是程序的核心界面,包含了抽奖按钮、显示结果的文本控件或者列表控件,以及可能的设置选项。 2. **数据管理**:程序可能有一个数据结构用于存储参与抽奖的人员或单位信息,这可能...

    BCB-program9.rar_it

    本压缩包"BCB-program9.rar"包含了一个用BCB编写的特定程序,专注于数字图像处理,特别是运用了细化方法。 细化是图像处理中的一个重要技术,常用于图像分割、特征提取和模式识别等。其主要目的是将图像中的线条或...

    看图猜谜,BCB程序

    1. **事件驱动编程**:BCB采用事件驱动模型,当用户执行特定操作(如点击按钮)时,会触发相应的事件处理函数。开发者需要编写这些函数来定义程序对事件的响应。 2. **VCL框架**:Borland C++ Builder使用Visual ...

    bcb101program.zip

    这个名为“bcb101program.zip”的压缩包包含了一系列与C++Builder程序开发相关的源代码和示例,对于学习和理解C++Builder在移动端应用开发的应用非常有价值。 首先,我们可以看到一个名为“Demo3”的文件,这通常...

    C++ Builder MDI 调用 DLL 子窗体(基于 BCB2010)

    C++ Builder MDI (Multiple Document Interface) 应用程序是一种允许用户同时处理多个文档的软件设计模式。在C++ Builder 2010环境下,MDI应用可以通过创建和管理子窗体来实现这一功能。本篇文章将深入探讨如何在C++...

Global site tag (gtag.js) - Google Analytics