C++ Builder 初学问与答(一)

C++ Builder 初学问与答(二十) 作者:董维春 网名:ch_builder(版权要求:请务必尊重知识产权,未经授权不要转载、摘录)17 事件及事件响应16)问:从前面的编程过程可以看出,用C++Builder开发应用程序的个特点是,大部分的编程工作是在响应事件和处理事件上。事件的产生可能来自于系统,也可能来自于用户。您能给我详细介绍下事件吗?答:好的,这节课我们将对事件进行深入地探讨,并重点讲述常用的鼠标和 阅读详情

C++ Builder初学问与答

(版权要求:本文除了经过CSDN授权或作者同意,不得转载)

 

    一直以来都想写一点为BCB初学者快速入门的东西,前不久写了几篇《闲谈BCB》想把自己学习BCB中如何来解决难点的方法说给大家,没想到被骂得不成样子。本想不写了,但觉得这些东西留下来能做什么呢?还是用另一种方法来重新演译我的思维吧,最近有些忙,那几篇没有写完的文章,我也会尽快写完的,至于《深入QR》,我想我一定会用另一种手法来写,让你一看就会把QR这个娇女的所有衣服都脱光,不整理到这个地步,我是不敢轻易再拿出来,还请朋友见谅!

本文分为《基础入门》、《快速提高》与《成功编程者》三部分。

 

第一部分:基础入门

1.窗体

1)问:Windows的编程就是在窗体的基础上实现的, C++Builder是怎样处理窗体的呢?

答:窗体的一部分功能通过窗体的属性来实现,窗体的属性非常多,这里只对其中比较重要的属性进行介绍。

1ActiveControl指定窗体上的某个组件为输入焦点。如下面的语句将窗体上的Label1组件成为输入焦点:ActiveControl=Label1。在同一时时刻,应用程序只能有一个输入焦点。

2BorderIcons用来设定标题栏上出现哪些系统图标。它是一个集合,可以设成以下几个类型:最大化按钮(biMaximize)、最小化按钮(biMinimize)、帮助按钮(biHelp)和系统菜单(biSystemMenu)

  3Icon属性用来指定当窗体最小化时显示的图标。

    4KeyPreview属性为true时,表示击键事件发生时先传给窗体,然后再传给有输入焦点的组件上,相当于窗体截获了原本属于组件的事件。缺省值为false,表示击键事件只送到当前有输入焦点的组件上。

5 Menu属性用来指定窗体的主菜单。

6Visible属性用来确定窗体是否可见。

此外还有一些运行时态属性,这些属性只有在程序运行的时候才能通过编程访问。这种属性主要有:

Active

属性用来确定窗体是否获得输入焦点。

ActiveMDIChild

这个函数将返回当前活动的子窗体。

DropTarget

属性用来指定窗体是否是拖放操作的对象。

Parent

属性用来设定包含窗体的窗口控件,通常是另一个窗体。如果窗体没有包含它的控件,那么它的Parent属性为nil

 

2)问: Windows窗体有很多样式,比如对话框,弹出窗口。如果我要控制窗体的边界样式,应该怎么办?

答:属性BorderStyle可以指定窗体边界的外观和行为。它一共有六种可能的取值。

bsDialog

表示大小不可变的标准的对话框边界。

bsSingle

表示大小不可变的单线边界。

bsNone

表示大小不可变、没有边界。

bsSizeable

表示标准的可改变大小的窗体。

bsToolWindow

bsSingle时类似,但是标题较小,用做工具框窗口。

bsSizeToolWin

bsSizeable时相似,但是标题较小,做工具框窗口。

要注意的是,对于MDI子窗体,bsDialogbsNone将不起作用。

 

3)问:同样是获得焦点,ActiveControlSetFocus()有什么不同?

答: ActiveControl是把焦点交给组件,它是一个属性。而SetFocus()是组件主动要焦点,是一个方法。书写格式也不一样。例如,我们想使同样的一个Button1获得焦点,可以下的两种写法:

ActiveControl=Button1Button1=SetFocus()

二者作用是一样的,不过一般都习惯用第一种方式。

 

 

4)问:属性FormStyle有什么作用?

答:属性FormStyle可以确定窗体的类型,它一共有四种属性值。

fsNormal

表示窗体既不是MDI父窗口也不是MDI子窗口,只可能是单文档SDI窗口或者对话框。这个属性值是缺省值。

fsMDIChild

表示这个窗体是一个MDI子窗口。

fsMDIForm

表示这个窗体是一个MDI父窗口。

fsStayOnTop

表示窗体始终保持在窗体所属工程中其它窗体的上面,除非还有别的窗体的FormStyle属性也被设置成了fsStayOnTop

要特别注意的是,在程序运行期间不要修改窗体的FormStyle属性。

 

5)问:属性Position有什么作用?

答:属性Position可以确定程序运行时出现在屏幕上的窗体的大小和位置,它有五种可能的取值。

 1poDesigned表示使用设计时指定的尺寸和位置属性时显示窗体。尺寸属性是指HeightWidth,位置属性是指LeftTop。这个属性值是缺省值。

 2poDefault表示窗体在屏幕上显示的位置和大小由Windows决定。每次运行应用程序时,窗体都会稍微向下向右移动。

 3poDefaultPosOnly表示窗体以设计时的窗体尺寸显示窗体,但是在屏幕上显示的位置由Windows确定。每次运行应用程序时,窗体都会稍微向下向右移动。当无法再向下移动时,就又会从屏幕的左上角开始显示。

 4poDefaultSizeOnly表示窗体的位置由设计时指定的值确定,而尺寸由Windows确定。

5poScreenCenter表示使用设计时指定的尺寸和位置属性,在屏幕的中央显示窗体。

 

6)问:如何最大化或最小化窗体?

答:属性WindowState与窗体的显示有关,它有三种可能的取值。

wsNormal

窗体既不是最大化显示也不是最小化显示。这个值是缺省值。

wsMinimized

窗体最小化显示。

wsMaximized

窗体最大化显示。

 

7)问:属性ClientHeightClientWidth有什么作用?

答:这两个属性用来定义窗体用户区域的高和宽。所谓用户区域窗体的实际工作区域,就是除了窗体的标题栏、菜单条、工具条和状态条以及边框之外的窗体区域。所以对于新创建的窗体,它的用户区域比窗体的大小要稍微小一些,相对而言,窗体的大小是由属性HeightWidth确定的。

8)问:如何动态创建一个窗体呢?

答:我们先创建一个主窗体MainForm,把她的Caption改为“主窗体”,把FormStyle属性改为fsMDIForm。再创建一个子窗体windows1,把Caption改为“子窗体”,把FormStyle属性改为fsMDIChild

选择“Project|Options…”菜单项,将会弹出一个如图所示的对话框。

在这里我们可以通过下拉框选择主窗体(Main form),在左侧的Auto-create forms里列出了所有的窗口,这里面的窗口通常是动态创建,你可以把需要动态创建的窗口(Available forms)通过中间的那四个按钮调到右侧,然后OK就可以了。

动态的创建的方法如下:

void _fastcall TForm1::Button1Click(TObject *Sender)

{

   Tform2 *Forms;

   try

   {

Form2=new TForm2(Application);//动态创建Form2

Form2->ShowModal();

delete Form2;//Form2释放

   }

   catch(Exception &exception)

   {

delete Form2;

Application->ShowException(&exception);

}

}

要注意一般你可能不喜欢用上面的那种形式,而写成如下格式:

void _fastcall TForm1::Button1Click(TObject *Sender)

{

   Tform2 *Forms;

Form2=new TForm2(Application);//动态创建Form2

……

}

你要记住,无论你的子窗体创建是否完成,你都必须运行delete来释放你刚才创建的子窗体,当然你也可以把释放的过程写在OnClose事件函数内,这个函数有一个参数为Action,它有四个取值:caNone为不关闭窗体,什么也不操作;caHide为不关闭窗体,但把它隐藏起来;caFree为关闭窗体,同时释放内存;caMinimize为最小化窗体,不关闭。所以我们也可以象下面这样来释放子窗体。

void _fastcall TForm2::FormClose(Tobject *Sender,TcloseAction &Action)

{

  Action=caFree;

}

9)问:为什么我们用Close()不能关闭我当前活动的子窗体?

答:关闭当前活动窗体,很多人会用如下的方法:

void _fastcall TForm1::Button2Click(Tobjcet *Sender)

{

  ActiveMDIChild->Close();//注意这是在主窗体(或者说在其它窗体)中来关闭当前活动的子窗体,这样做不好,一般的关闭应该象10)问中那样来做

}

此时窗体并没有关闭,而是最小化了,因此要在子窗体的OnClose事件中用如下代码来关闭。

void _fastcall TForm2::FormClose(Tobject *Sender,TCloseAction &Action)

{

  Action=caFree;

}

这段程序不用多说了,上面都说过了。

这里有一点要说明一下,就是在调用Close()时,会自动触发OnClose事件,而由上我们知道窗体没有关闭,而是最小化,说明在OnCloseAction的此时的值为caMinimize。所以我们要写上面的方法来关闭。

10)问:Show()ShowModal()有什么不同?

答:我们的程序中不可能就只有一个Form,比如,有Form1Form2两个窗口,我们在Form1中调用Form2应该先在Unit1.cpp的开头部分加入:

#include “Unit2.h”

在要调用的地方加入:

Form2->Show();//或是Form2->ShowModal();

两者的区别在于若使用了ShowModal()则必须关闭Form2,才能处理其它窗口的内容,而Show()则不用。当然你可以直接在Form2直接创建一个Button1来关闭她,程序内容如下:

void _fastcall TForm2::Button1Click(Tobject *Sender)

{

 Close();

}

Close前,不需要加上Form2,因为这行程序就是在Form2上运行的,所以默认的父组件就是Form2

(待续)

C++ Builder 初学问与答(十三) C++ Builder初学问与答(版权要求:本文仅授权CSDN使用,另授权CCRUN转载,其他个人与网站不得转载、摘录,若有特别需求可与作者联系)第二部分:快速提高好久以来有不少朋友问我,《C++ Builder问与答》为什么不继续写了?我也直在思考还应该写下去不?CBX的推出,加之宝兰宣布不在出新的CB版本,让我们这些直喜爱CB的人不清楚下个方向到底在何处?当然真的希望CB会继 阅读详情

相关推荐

C++ Builder 初学问与答(十四)

(版权要求:本文仅授权CSDN使用,另授权CCRUN转载,其他个人与网站不得转载、摘录,若有特别需求可与作者联系) (4)利用C++Builder集成开发环境中的视图“View”菜单,我们可以显示或隐藏C++Builder集成开发环境中的不同的部分,也可以用于打开属于集成调试器的窗口。 “Project Manager”菜单项用于显示工程管理器。“Object Insp

ch_builder的专栏 2594

C++(Win32API)检测窗体的激活(焦点,和失去焦点)状态,并执行对应消息处理

我们经常在使用应用时候,应用都会检测窗口焦点并进行消息处理,比如VS2019的边框: 那么,这些消息般都是在WM_ACTIVATE:里面实现的 不用多说,先直接 case WM_ACTIVATE: //code 随后,找到自己代码的这片段 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 加入后如下 LRESULT CALLBACK WindowProc(HWND hwnd, UINT u

qq_43343284的博客 5173

C++ Builder 初学问与答(二)

2.文本输入组件11)问:如果要实现文本输入,在C++Builder中应该怎么办?答:C++Builder常用文本输入组件来实现,常用的文本输入组件有Edit、MaskEdit 、Memo和RichEdit。他们的主要不同在于Edit和MaskEdit用于输入单行文本,而Memo和RichEdit可以输入多行文本。此外Label组件也可用来进行文本显示。Edit和MaskEdit是

ch_builder的专栏 2699

C++Builder中自定义预览窗口

 在C++Builder中自定义预览窗口 Borland C++ Builder是基于C++语言的可视化编程环境,它提供了可重用组件库和系列RAD设计工具,使得编程者只需用少量的手工代码就可以创建出高效的Windows应用程序,尤其是复杂的数据库访问应用程序,因此深受软件开发人员的喜爱。 在开发数据库访问应用程序时,会经常涉及到报表的打印问题。C++ Builder中提

HainuCrazy的专栏 1611

C++设计模式之生成器模式(Builder

生成器是种创建型设计模式,使你能够分步骤创建复杂对象。该模式允许你使用相同的创建 代码生成不同类型和形式的对象。假设有这样个复杂对象,在对其进行构造时需要对诸多成员变量和嵌套对象进行繁复的初始化工作。这些初始化代码通常深藏于个包含众多参数且让人基本看不懂的构造函数中;甚至还有更糟糕的情况,那就是这些代码散落在客户端代码的多个位置。如果为每种可能的对象都创建个子类,这可能导致程序过于复杂:例如, 我们来思考如何创建个房屋(House)对象。

波风水门 2619

C++ builder基础

C++ builder 简介 C++ Builder是由Borland公司推出的款可视化集成开发工具。C++ Builder具有快速的可视化开发环境:只要简单地把控件(Component)拖到窗体(Form)上,定义下它的属性,设置下它的外观,就可以快速地建立应用程序界面。 Inprise(原Borland)公司推出的Turbo C、Turbo C++ 、Borland C++ 以及Borland C++ Builder,无不是 C/C++ 编程者所钟爱的编程工具,而且每个都称得上经典之作,Delp

weixin_43820463的博客 9555

C++之生成器(builder)模式

0. 简介 生成器是种创建型设计模式, 当构建个复杂对象时,将构建过程与表示分离。使得同样的过程创建不同的对象。生成器与其他创建型模式不同, 生成器不要求产品拥有通用接口。 这使得用相同的创建过程生成不同的产品成为可能。生成器方法通常支持方法链 (例如 someBuilder->setValueA(1)->setValueB(2)->create() ),来组成复杂的对象。相比于工厂模式专门用于生产系列相关对象而言,生成器重点关注如何分步生成复杂对象。 1. 生成器UML介绍 生

lovely_yoshino的博客 1万+

C++ Builder 初学问与答(四)

4.列表类组件31)问:当我需要使用多个选项的时候,使用单选按钮或复选框来进行选择不是很恰当,因为在窗体上放置大量的按钮既不利于布局的美观,又会消耗大量的系统资源,C++Builder有什么解决办法吗?答:可以使用列表框(ListBox、CheckListBox)或组合框(ComboBox)这两类最常用的列表组件。32)问:列表框有那些主要属性?答:列表组件ListBox在缺省情况

ch_builder的专栏 2515

C++ Builder 初学问与答 (十二)

(本系列文章,仅供CSDN使用,另授权CCRUN转载,其他个人与网站不得转载、摘抄,如需使用请与作者或CSDN联系) 13.对话框组件     96)问:怎样编写文件打开、保存等对话框?  答:C++Builder为我们提供了许多常用的对话框组件,这些对话框组件都放在组件模板的Dialogs选项卡中,例如Font,Color,Open和Print对话框。其中OpenDialog对话

ch_builder的专栏 2551

C++ Builder 初学问与答(十五)

(版权要求:本文仅授权CSDN使用,另授权CCRUN转载,其他个人与网站不得转载、摘录,若有特别需求可与作者联系) (7)在C++Builder集成开发环境中,还有Component菜单。在组件菜单下的菜单命令是有关建立、安装、重建组件的菜单项。其中,“New Component”菜单项打开组件向导建立新组件。“Install Component”菜单项安装新的组件。“

ch_builder的专栏 2492

C++ Builder 初学问与答(廿

作者:董维春 网名:ch_builder(版权要求:请务必尊重知识产权,未经授权不要转载、摘录)25)问:控件是怎样处理拖曳的呢?答:当控件接受被拖曳的对象后会产生OnDragDrop事件,我们需要对这个事件进行响应,在对象观察器中双击控件的OnDragDrop事件域,生成它的处理模板。       加入这样段代码,第二条语句判断被拖拽的对象是不是自己,否则不接受拖拽第三

ch_builder的专栏 3089

C++ Builder 初学问与答(三)

3. 按钮类组件 21)问:在进行Windows程序界面设计中,经常会用到按钮,在C++Builder中,按钮定是通过按钮组件来实现的吗?答:是的,并且C++Builder的按钮类组件十分丰富。BCB提供了两类按钮类组件:类是执行类按钮,另类是信息类按钮。所谓执行类按钮是指它们通常用来启动程序运行的,比如按钮、位图按钮、加速按钮。而信息类按钮般用来获取信息,包括单选按钮和复选框

ch_builder的专栏 2709

C++ Builder 初学问与答(六)

6.图形列表组件TreeView45)问:有时侯,我希望实现类似资源管理器对文件夹管理的显示方式,和对文件的管理显示方式,在C++Builder中应该怎么办?答:在C++Builder中可以直接使用图形列表组件来实现,它包括TreeView、ListView以及Outline组件。其中Outline组件实际上是基于Windows 3.1环境的组件,而且无论从功能还是使用的角度来看,它都无法

ch_builder的专栏 2583

C++ Builder 初学问与答(七)

53)问:能介绍下TTreeNodes与TTreeNode?答:在BCB中,树状视图的节点是通过TTreeNodes对象来管理的,通过这个对象可以对树状视图进行动态的增加、删除、插入、移动节点等操作。而每个节点都是个TTreeNode对象。TTreeNode的主要属性和函数:Count:这个属性用来返回某个节点所拥有的子节点的数目。它不包括其子节点。Item:其声明为:_pr

ch_builder的专栏 2625
上一篇: 幽雅BDE(二)
下一篇: C++ Builder 初学问与答(二)
ch_builder
博客等级 码龄24年 76粉丝 58原创
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值