520 likes | 945 Views
综合基础 从 C/C++ 到 C++ Builder. 为了强化 C++ Builder 的功能, C++ Builder 通过类别的形式提供了大量的 VCL 组件,不但加速了程序的开发,也方便了程序的维护,但相对的也衍生出许多 C/C++ 中所没有的数据型态和处理机制。本章将针对常用的型态与机制进行介绍,让读者熟悉 C++ Builder 的特有语法,也充分利用 C++ Builder 的强大功能。. 大纲. 1-1. 基本数据型态 1 -2. AnsiString 型态 1-3. 常用类别型态 1-4. 例外处理机制 1-5. 类别转换机制.
E N D
综合基础 从C/C++到C++ Builder 为了强化C++ Builder的功能,C++ Builder通过类别的形式提供了大量的VCL组件,不但加速了程序的开发,也方便了程序的维护,但相对的也衍生出许多C/C++中所没有的数据型态和处理机制。本章将针对常用的型态与机制进行介绍,让读者熟悉C++ Builder的特有语法,也充分利用C++ Builder的强大功能。
大纲 • 1-1. 基本数据型态 • 1-2. AnsiString型态 • 1-3. 常用类别型态 • 1-4. 例外处理机制 • 1-5. 类别转换机制
1-1.基本数据型态 • C/C++中纪录基本数据型态所使用的内存大小会随着编译器的不同而有所不同,进而影响数据型态所能储存的数据,以下为C++ Builder中对整数和浮点数基本型态的定义,包括使用的位空间和所能表示的数值。
1-1. 基本数据型态 • 浮点数: • 此外,C++ Builder和C/C++最大的差别在于它提供了对字符串的支持,而非C/C++中使用的字符数组或是字符串指针,且在C++ Builder窗口环境中,使用字符串的机会远比字符数组或指针大的多,在1-2节中我们将有对字符串的完整介绍。
1-2.AnsiString数据型态 • 在C++ Builder中的字符串称为AnsiString数据型态,该型态继承至Delphi而来,原因在于C++ Builder共享了Delphi中的大部分VCL组件,而Delphi使用的Object Pascal语法拥有所谓的字符串型态,为了能顺利使用Delphi中的程序资源,所以继承Delphi的字符串型态(String)以方便对VCL组件进行设定的动作。 • 1-2-1. 使用AnsiString • 要建立一个AnsiString有很多方法,其中最简单方式就是和基本型态一样以宣告的方式建立一个AnsiString型态的变量,除此,亦可透过Constructor建构子的使用来产生一个AnsiString变量,底下为几种宣告的示范:
1-2.AnsiString数据型态 • 从上面的表格中可知,基本型态的数值几乎都可以转成AnsiString型态,而除了使用建构子达成转换的目的外,C++ Builder还提供AnsiString和基本型态的转换函式,列表如下:
说明: FloatToStr和FloatToStrF的差别在于FloatToStrF可依照指定格式进行转换,格式为FloatToStrF(Extended Value, TFloatFormat Format, int Precision, int Digits),其中Value为浮点数;Format设定转换格式;Precision指定精确度;Digits设定显示小数字数。
1-2. AnsiString数据型态 • 除了可以自由转换成熟悉的基本型态外,AnsiString相较于字符串指针最大的优点在于可以使用操作数直接进行运算,使用方式就如同一般的基本型态,而不像字符串指针的所有运算都必须靠函式的呼叫来完成
1-2. AnsiString数据型态 • 至此,可发现AnsiString不但可任意转换型态,还能进行运算比较,比过去C/C++中使用的字符串指针来的方便,但好戏还不止于此,C++ Builder对AnsiString型态提供了众多的字符串处理函式,让基本的字符串处理工作变的轻轻松松,这些函式将在下一小节说明。 • 1-2-2. AnsiString字符串处理函式 • AnsiString字符串处理函式包罗万象,下面仅就常用的函式进行说明和示范:
1-2. AnsiString数据型态 • 习惯了AnsiString型态和其提供的方法后,会发觉AnsiString在很多情况下都比过去的字符串指针来的方便,尤其是在VCL组件属性或方法设定上,但缺点就是所写的程序代码不能在其它编译器下进行编译。
1-3. 常用类别型态 • 除了AnsiString字符串型态外,C++ Builder为了组件的设定方便还提供了许多的类别型态,这些型态最常出现在组件的属性或是方法指定上,底下我们仅就常用的TStrings、参数和时间相关类别型态进行介绍。 • 1-3-1. TStrings型态 • TStrings为一个以列表方式纪录AnsiString型态数据的类别,也就是以数组方式来储存大量的AnsiString数据,所以举凡能以条列方式显示文字数据的VCL组件几乎都透过TStrings型态来纪录所要显示的内容,包括:TListBox、TComboBox、TMemo和TStringGrid组件,像TListBox和TComboBox使用TStrings类别的Items属性完成显示内容的设定;TMemo使用Lines属性;TStringsGrid使用Rows属性。此外,由于TStrings为一个类别???
1-3. 常用类别型态 • 常用属性:
1-3. 常用类别型态 • 常用方法: • 1-3-2. 参数类别 • 参数类别包含TParam和TParams两种,其中TParam纪录个别参数的内容,如Name=Value,而TParams则为TParam的集合,储存了多个的参数内容。在C++ Builder中,很多数据库组件都以TParams类别作为传递参数的依据,而TParams类别再透过其内的TParam传递每个参数和对应的值,如TQuery、TADOuery和TSQLQuery组件,底下为TParam和TParams常用的属性与方法:
1-3. 常用类别型态 • TParam类别 • 常用属性:
1-3. 常用类别型态 • TParams类别 • 常用属性: • 常用方法:
1-3. 常用类别型态 • 1-3-3. 时间类别 • 在开发程序的过程中,时间是一个很常使用到的变量,不论是算程序的执行时间或是作为计算效能的依据,除此,日期变量亦常作为计算使用,如每笔交易纪录的时间、应用程序的有效日期等,所以在本小节中将就C++ Builder提供的时间类别进行介绍,虽然说C/C++也有所谓的时间型态,但C++ Builder的时间类别能和Timer、DateTimePicker等C++ Builder内附组件配合使用,在使用上更为方便。 • C++ Builder提供了三个主要的时间类别:TTime、TDate和TDateTime,分别用以表示时间、日期和时间日期,这些类别主要以浮点数的型态来纪录日期时间的值,以1899年12月30日的上午12时为浮点数0所代表的意义,当然我们可以不需要管这些内部处理的细节,而只需透过包装好的TTime、TDate和TDateTime类别来处理所有的时间计算。对于这些时间类别,C++ Builder提供了一些好用的方法或函式来方便你设定时间类别的值或是做些时间上的判断,如下所示:
1-3. 常用类别型态 • 取得日期部分
1-3. 常用类别型态 • 常用日期处理函式/方法
常用时间处理函式/方法 1-3. 常用类别型态
1-4. 例外处理机制 • 在写程序时,难免因为考虑不周而产生一些特殊情形才会发生的错误,造成计算机的不稳定,为了避免这样的情形发生,C++ Builder提供了例外处理机制来确保程序的稳定执行。所谓的例外处理机制在于程序执行时拦截所有可能发生的错误,并产生对应的例外错误事件,这事件中纪录了错误的类型与说明,而由于错误已经被拦截,所以可以在不影响系统的稳定和资源下跳过错误指令继续执行程序,至于拦截到的讯息则可以提供原设计师做为改正程序的参考,底下为基本的例外处理范例:
1-4. 例外处理机制 • 在try{}中的程序代码即为被例外处理机制所监督的程序区块,而catch{}中的程序代码则为例外发生时所要执行的程序内容 • 以上面的例子来说,当Edit1->Text为0时会发生除数为0的错误 • 而为了避免除数为0错误对程序执行可能造成的影响,我们使用catch来监督EDivByZero(除数为0)错误类别的发生,其中EDivByZero为专门监督除数为0错误的例外处理类别,当除数为0的错误发生后就会自动进入catch区块中执行程序,并跳过try{}区块中程序执行错误后面的程序代码,下面为Exception错误发生的消息框。
1-4. 例外处理机制 • 上面程序片段中使用了EDivByZero例外处理类别解决了除数为0的错误,而C++ Builder还提供了其它的例外处理类别来解决不同的例外事件,下面为常见的例外处理类别。
1-4. 例外处理机制 • 倘若一个程序区块内可能发生两种不同类型的错误,而对于这两种错误希望能分别处理,则可以透过多次的catch使用来撰写不同的处理内容
1-4. 例外处理机制 • 上面的程序代码利用两个catch{}区块处理了两种不同的错误,在每个例外处理中加入对应的程序代码,这种将不同例外处理交由不同catch{}区块来处理的好处就是可以针对错误类型进行特别处理,如加入对应的中文错误讯息说明或错误的自动校正功能,至于不针对特定类别的例外处理可使用下面的范例来监督所有可能的例外发生。
1-4. 例外处理机制 • 或
1-4. 例外处理机制 • 除了程序执行过程因为错误发生而进入例外处理机制外,对于一些特殊的应用,我们亦可透过throw方法的呼叫来强迫例外处理类别的产生,进而引发对应的例外处理机制,底下为throw使用的范例。