综合基础 从 c/c++ 到 c++ builder

52
1 综综综综 综 C/C++ 综 C++ Builder 综综综综 C++ Builder 综综综C++ Builder 综 综综综综综综综综综综综综 VCL 综综 综综综综综综综综综综综 综综 ,, 综综综综综综综 综综综综综综综综综综 C/C++ 综综综综综综综综综综 综综综综 综综综综综综综综综综综综综综综综综综 综综综综综 。, C++ Builder 综综综综综 综综综综综 C++ Builder 综综综 综综

Upload: galvin

Post on 17-Jan-2016

294 views

Category:

Documents


0 download

DESCRIPTION

综合基础 从 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. 类别转换机制. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 综合基础  从 C/C++ 到 C++ Builder

1

综 合 基 础 从 C/C++ 到 C++ Builder

为了强化 C++ Builder 的功能, C++ Builder 通过类别的形式提供了大量的 VCL 组件,不但加速了程序的开发,也方便了程序的维护,但相对的也衍生出许多 C/C++ 中所没有的数据型态和处理机制。本章将针对常用的型态与机制进行介绍,让读者熟悉 C++ Builder 的特有语法,也充分利用 C++ Builder 的强大功能。

Page 2: 综合基础  从 C/C++ 到 C++ Builder

2

大纲

• 1-1. 基本数据型态• 1-2. AnsiString 型态• 1-3. 常用类别型态• 1-4. 例外处理机制• 1-5. 类别转换机制

Page 3: 综合基础  从 C/C++ 到 C++ Builder

3

1-1. 基本数据型态

• C/C++ 中纪录基本数据型态所使用的内存大小会随着编译器的不同而有所不同,进而影响数据型态所能储存的数据,以下为 C++ Builder中对整数和浮点数基本型态的定义,包括使用的位空间和所能表示的数值。 型别 位大小 (Bits)

char 8

unsigned char 8

short int 16

unsigned short 16

int 32

long 32

enum 32

unsigned int 32

Page 4: 综合基础  从 C/C++ 到 C++ Builder

4

1-1. 基本数据型态

• 浮点数:

• 此外, C++ Builder 和 C/C++ 最大的差别在于它提供了对字符串的支持,而非 C/C++ 中使用的字符数组或是字符串指针,且在 C++ Builder 窗口环境中,使用字符串的机会远比字符数组或指针大的多,在 1-2 节中我们将有对字符串的完整介绍。

型别 位大小 (Bits) 数值区间float 32 1.18*10^-38<|X|<3.40*10^38

double 64 2.23*10^-308<|X|<1.79*10^308

long double 80 3.37*10^-4932<|X|<1.18*10^4932

Page 5: 综合基础  从 C/C++ 到 C++ Builder

5

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 变量,底下为几种宣告的示范:

宣告 / 建构子 范例AnsiString() 基本宣告 AnsiString Str="Hello World!"

AnsiString(const char* src)

char *temp="Hello World!";

AnsiString Str(temp);

Page 6: 综合基础  从 C/C++ 到 C++ Builder

6

1-2.AnsiString 数据型态宣告 / 建构子 范例

AnsiString(const AnsiString& src)AnsiString temp="Hello World!";

AnsiString Str(temp);

AnsiString(const char* src, unsigned char len);

chat *temp="Hello World";

AnsiString Str=AnsiString(temp,5);

AnsiString(int) int temp=5168;

AnsiString Str=AnsiString(temp);

AnsiString(double) double temp=123.45;

AnsiString Str(temp);

AnsiString(char) char temp='A';

AnsiString Str=AnsiString(temp);

AnsiString(unsigned long)unsigned long temp=1234567;

AnsiString Str=AnsiString(temp);

Page 7: 综合基础  从 C/C++ 到 C++ Builder

7

1-2.AnsiString 数据型态• 从上面的表格中可知,基本型态的数值几乎都可以转成 AnsiString 型态,而除了使用建构子达成转换的目的

外, C++ Builder 还提供 AnsiString 和基本型态的转换函式,列表如下:

AnsiString

型态 函式 范例

整数 StrToInt() int a=StrToInt("1234");

浮点数 StrToFloat() float a=StrToFloat("1234.5");

日期 StrToDate() TDate a=StrToDate("2002/2/2");

时间 StrToTime() TTime a=StrToTime("20:20");

日期时间 StrToDateTime() TDateTime a=StrToDateTime("2002/2/2 8:30");

字符串指针 c_str()char * a = new char[Edit1->Text.Length() +1];

strcpy(a, Edit1->Text.c_str());

币值 StrToCurr() Currency a=StrToCuur("12.1");

Page 8: 综合基础  从 C/C++ 到 C++ Builder

8

型态AnsiString

函式 范例

整数 IntToStr() IntToStr(123);

浮点数 FloatToStr() 、 FloatToStrF()

FloatToStr(10.123);FloatToStrF(10.123,ffFixed,7,3);

日期 DateToStr() DateToStr(Date());

时间 TimeToStr() DateToStr(Time());

日期时间 DateTimeToStr() DateToStr(Now());

字符串指针 AnsiString()char *temp="Hello World!";AnsiString(temp);

币值 CurrToStr() CurrToStr(10.11);

说明:FloatToStr 和 FloatToStrF 的差别在于 FloatToStrF 可依照指定格式进行转换,格式为 FloatToStrF(Extended Value, TFloatFormat Format, int Precision, int Digits) ,其中 Value 为浮点数; Format 设定转换格式;Precision 指定精确度; Digits 设定显示小数字数。

Page 9: 综合基础  从 C/C++ 到 C++ Builder

9

1-2. AnsiString 数据型态• 除了可以自由转换成熟悉的基本型态外, AnsiString 相较于字符串指针最大

的优点在于可以使用操作数直接进行运算,使用方式就如同一般的基本型态,而不像字符串指针的所有运算都必须靠函式的呼叫来完成

操作数 功能 范例+ 字符串相加 "Hello"+" World"

= 指定运算 temp="Hello"+" World"

== 相等条件与否 if (temp=="Hello World")…

!= 不等条件判断 if (temp!="Hello World")..

< 小于判断 if (temp<"0")…

> 大于判断 if (temp>"9")…

<= 小于等于判断 if (temp<="9")…

>= 大于等于判断 if (temp>="0")…

[] 字符串数组索引 output=temp[1];

Page 10: 综合基础  从 C/C++ 到 C++ Builder

10

1-2. AnsiString 数据型态

– 至此,可发现 AnsiString 不但可任意转换型态,还能进行运算比较,比过去 C/C++ 中使用的字符串指针来的方便,但好戏还不止于此, C++ Builder 对 AnsiString 型态提供了众多的字符串处理函式,让基本的字符串处理工作变的轻轻松松,这些函式将在下一小节说明。

• 1-2-2. AnsiString 字符串处理函式– AnsiString 字符串处理函式包罗万象,下面仅就常用的函式进行说

明和示范:AnsiCompare

函数宣告: int AnsiCompare(const AnsiString& rhs) const;

说明:比较两字符串的内容:两字符串相同传回 0 ;小于传回 -1 ;大于传回 1

范例: if(Edit1->Text.AnsiCompare("Hello")) ShowMessage(" 字符串相等 ");

Page 11: 综合基础  从 C/C++ 到 C++ Builder

11

1-2. AnsiString 数据型态

AnsiPos

函数宣告: int AnsiPos(const AnsiString& subStr) const;

说明:回传 subStr 在字符串中的位置,回传值为 0 表示 subStr 不存在于字符串中。范例: Edit1->Text.AnsiPos("Hello");// 回传 "Hello" 在 Edit1 输入框中的位置

AnsiCompareIC

函数宣告: int AnsiCompareIC(const AnsiString& rhs) const;

说明:和 AnsiCompare() 功能相同,但不考虑字符串的大小写。范例: if(Edit1->Text.AnsiCompareIC("Hello")) ShowMessage(" 字符串相等 ");

Page 12: 综合基础  从 C/C++ 到 C++ Builder

12

1-2. AnsiString 数据型态

Delete

函数宣告: AnsiString Delete(int index, int count)

说明:从字符串的第 index 个字符开始删除 count 字符,字符串的第一个字符index 为 1

范例:AnsiString tem="Hello World";tem.Delete(1,6); //tem 字符串删除后为 "World"

cat_printf

函数宣告: AnsiString cat_sprintf(const char* format, ...);

说明:依照格式将字符串附加于原有字符串之后范例: s.cat_sprintf("Dear %s",Edit1->Text);

Page 13: 综合基础  从 C/C++ 到 C++ Builder

13

1-2. AnsiString 数据型态

FloatToStrF

函数宣告:AnsiString FloatToStrF(Extended Value, TFloatFormat Format, int Precision, int Digits);

说明:依照 Format 设定的输出格式、 Precision 指定的精确度和 Digits 限制的小数点后位数对 Value 浮点数进行字符串转换的动作。 Format 有ffGeneral( 一般 ) 、 ffExponent( 科学符号 ) 、 ffFixed( 固定小数点位置 ) 、ffNumber( 千位分隔号 ) 和 ffCurrency( 钱币 ) 五种格式。范例:float tem= 87654.325;AnsiString str=FloatToStrF(tem,ffNumber,7,2);//str="87,654.33" ,小数第三位四舍五入

Page 14: 综合基础  从 C/C++ 到 C++ Builder

14

1-2. AnsiString 数据型态FormatFloat

函数宣告:AnsiString FormatFloat(const AnsiString Format, Extended Value);

说明:依照 Format 格式转换 Value 浮点数。范例:Format 格式 说明 12345 -12345 0.8

0 整数四舍五入 12345 -12345 1

0.00 小数两位 12345.00 -12345.00 0.80

#.## 有值才显示 12345 -12345 .8

#,##0.00 千位分隔号 12,345.00 -12,345.00 0.80

#,##0.00;(#,##0.00)

正负号格式不同 12,345.00

(-12,345.00)

0.80

0.000E+00符合格式的科学符号

1.235E+05

-1.235E+05 8.000E-01

Page 15: 综合基础  从 C/C++ 到 C++ Builder

15

1-2. AnsiString 数据型态

IntToHex

函数宣告: AnsiString IntToHex(int Value, int Digits);

说明:把整数转成 16 进位的 AnsiString 。范例: ShowMessage(IntToHex(168,2));// 显示的值为 A8

Insert

函数宣告: AnsiString& Insert(const AnsiString& str, int index);

说明:从字符串的第 index 字符开始插入 str 字符串,而原有 index 后的字符串会往后挪移。范例: AnsiString temp="Hello";temp.Insert(" World",6);// 新增后的字符为 "Hello World"

Page 16: 综合基础  从 C/C++ 到 C++ Builder

16

1-2. AnsiString 数据型态

IsPathDelimiter

函数宣告: bool IsPathDelimiter(int index);

说明:判断 Index 字符是否为反斜线字符 "\" ,如果是则回传 True 。范例: if (dirStr.IsPathDelimiter(dirStr.Length())) ShowMessage("Match!");

IsDelimiter

函数宣告:bool IsDelimiter(const AnsiString Delimiters, const AnsiString S, int Index);

说明:判断 S 字符串中第 Index 字符是否存在于 Delimiters 字符串中,若存在则传回 true 。范例: if (IsDelimiter("\\", dirStr, dirStr.Length())) ShowMessage("Match!");

Page 17: 综合基础  从 C/C++ 到 C++ Builder

17

1-2. AnsiString 数据型态

LastDelimiter

函数宣告: int LastDelimiter(const AnsiString& delimiters);

说明:传回字符串中最后一个 delimiters 字符串的位置范例: int pos=dirStr.LastDelimiter("\\");// 传回最后一个 "\\" 的位置

IsEmpty

函数宣告: bool IsEmpty();

说明:判断字符串是否为空字符串,是则回传 True 。范例: if(str.IsEmpty()) ShowMessage("String is empty");

Page 18: 综合基础  从 C/C++ 到 C++ Builder

18

1-2. AnsiString 数据型态

Length

函数宣告: int Length();

说明:传回字符串的长度范例: int len=Edit1->Text.Length(); //Edit1 输入框中输入字符串的长度

LastDelimiter

函数宣告: int LastDelimiter(const AnsiString& delimiters);

说明:传回字符串中最后一个 delimiters 字符串的位置范例: int pos=dirStr.LastDelimiter("\\");// 传回最后一个 "\\" 的位置

Page 19: 综合基础  从 C/C++ 到 C++ Builder

19

1-2. AnsiString 数据型态

Pos

函数宣告: int Pos(const AnsiString& subStr);

说明:传回 subStr 字符串在此字符串中的位置,若不存在则回传值为0 。范例: AnsiString temp="Hello World";ShowMessage(IntToStr(temp.Pos("World")));

LowerCase

函数宣告: AnsiString LowerCase();

说明:把字符串内容全部变成小写。范例: dirStr.LowerCase(); // 把 dirStr 字符串内容转为小写

Page 20: 综合基础  从 C/C++ 到 C++ Builder

20

1-2. AnsiString 数据型态

SubString

函数宣告: AnsiString SubString(int index, int count);

说明:回传从字符串第 index 个字符开始的 count 个字符所形成的子字符串。范例: AnsiString temp=dirStr.SubString(2,2);

sprintf

函数宣告: AnsiString& sprintf(const char* format, ...);

说明:依照指定格式设定字符串内容。格式的设定和 C 中的 printf 相同。范例: AnsiString temp;temp.sprintf("Hello %s :",Edit1->Text);

Page 21: 综合基础  从 C/C++ 到 C++ Builder

21

1-2. AnsiString 数据型态

TrimLeft

函数宣告: AnsiString TrimLeft();

说明:去除字符串中字头所含的空白。范例: Edit1->Text.TrimLeft();

Trim

函数宣告: AnsiString Trim();

说明:去除字符串的前后空白。范例: Trim(Edit1->Text); 或 Edit1->Text.Trim();

TrimRight

函数宣告: AnsiString TrimLeft();

说明:去除字符串中字尾所含的空白。范例: Edit1->Text.TrimRight();

Page 22: 综合基础  从 C/C++ 到 C++ Builder

22

1-2. AnsiString 数据型态

ToIntDef

函数宣告: int ToIntDef(int defaultValue);

说明:把字符串转成整数型态,转换失败则使用 defaultValue 作为输出。

范例: int temp=str.ToIntDef(123);

ToInt

函数宣告: int ToInt();

说明:把字符串转成整数,但字符串内容不允许非数字字符的出现。范例: int temp=str.ToInt();

Page 23: 综合基础  从 C/C++ 到 C++ Builder

23

1-2. AnsiString 数据型态

– 习惯了 AnsiString 型态和其提供的方法后,会发觉 AnsiString 在很多情况下都比过去的字符串指针来的方便,尤其是在 VCL 组件属性或方法设定上,但缺点就是所写的程序代码不能在其它编译器下进行编译。

UpperCase

函数宣告: AnsiString UpperCase();

说明:把字符串内的字符转成大写形式。范例: AnsiString temp=str.UpperCase();

Page 24: 综合基础  从 C/C++ 到 C++ Builder

24

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 为一个类别 ???

Page 25: 综合基础  从 C/C++ 到 C++ Builder

25

1-3. 常用类别型态

– 常用属性:

属性 说明Count 显示目前 TStrings中纪录的字符串数目。

CommaText以 AnsiString型态显示 TStrings中的所有字符串内容,字符串间以逗点分隔。

Text以 AnsiString型态显示 TStrings中的所有字符串内容,但以断行符号分隔不同字符串。

Strings 以数组型态读取 TStrings内容,如 Strings[0]。

Values当 TStrings内容为 Name=Value时,可以透过Values["Name"]的方式读取对应的 Value值。

Page 26: 综合基础  从 C/C++ 到 C++ Builder

26

1-3. 常用类别型态

– 常用方法:

• 1-3-2. 参数类别– 参数类别包含 TParam 和 TParams 两种,其中 TParam 纪录个别参数的

内容,如 Name=Value ,而 TParams 则为 TParam 的集合,储存了多个的参数内容。在 C++ Builder 中,很多数据库组件都以 TParams 类别作为传递参数的依据,而 TParams 类别再透过其内的 TParam 传递每个参数和对应的值,如 TQuery 、 TADOuery 和 TSQLQuery 组件,底下为TParam 和 TParams 常用的属性与方法:

方法 说明Add(const AnsiString S) 新增字符串 S 到 TStrings中。Clear(Void) 清掉 TStrings中的所有字符串内容。Delete(int Index) 清掉第 Index个字符串内容。Equals(TString* Strings) 判断两个 TStrings是否相等。

Page 27: 综合基础  从 C/C++ 到 C++ Builder

27

1-3. 常用类别型态

– TParam 类别• 常用属性:

属性 说明AsString 当参数为字符串类型时,透过 AsString指定参数值。AsInteger 当参数为整数类型时,透过 AsInteger指定参数值。AsFloat 当参数为浮点数类型时,透过 AsFloat指定参数值。

DataType设定 TParam参数的类型,有 ftString(字符串 ) 、 ftInteger(整数 ) 、 ftDate(日期 ) 、 ftFloat(浮点数 ) 、 ftTime(时间 )等。

Name 设定参数的名称。Text 把参数的值转成字符串形式呈现。

Value存取参数的值。 (建议使用AsString 、 AsInteger 、 AsFloat 、 AsTime…等方式存取参数值能得到较好的效能 )。

Page 28: 综合基础  从 C/C++ 到 C++ Builder

28

1-3. 常用类别型态

– TParams 类别• 常用属性:

• 常用方法:

属性 说明

Items透过 Items属性纪录参数的值。

Count回传 TParams中所纪录的参数个数。

ParamValues透过 ParamValues["Name"]方式传回对应的参数值。

方法 说明AddParam(TParam* Value) 新增一个 TParam参数到 TParams中。AssignValues(TParams* Value) 以 Value这个 TParams设定目前的参数值。IsEqual(TParams* Value) 判断两个 TParams是否相同。

Page 29: 综合基础  从 C/C++ 到 C++ Builder

29

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 提供了一些好用的方法或函式来方便你设定时间类别的值或是做些时间上的判断,如下所示:

Page 30: 综合基础  从 C/C++ 到 C++ Builder

30

1-3. 常用类别型态– 取得日期部分

函式 说明Now() 以 TDateTime类别回传今天的日期和时间。Date() 以 TDateTime类别回传今天的日期。Time() 以 TDateTime类别回传今天的时间。Today() 以 TDateTime类别回传今天的日期。

Tomorrow() 以 TDateTime类别回传明天的日期。

Yesterday() 以 TDateTime类别回传昨天的日期。CurrentYear() 以四位整数回传目前的公元年份。

Page 31: 综合基础  从 C/C++ 到 C++ Builder

31

1-3. 常用类别型态

– 常用日期处理函式 /方法

函式 /方法 单元文件说明DateOf(TDateTime Value) DateUtils

把 TDateTime变量的时间部分归零。DayOf(TDateTime AValue) DateUtils

回传 AValue所指定月份的天数。DayOfTheMonth(TDateTime AValue) DateUtils

和 DayOf相同。DayOfTheWeek(TDateTime AValue) DateUtils

以数字形式回传 AValue日期为星期几, 1表示星期天, 7表示星期六。

Page 32: 综合基础  从 C/C++ 到 C++ Builder

32

1-3. 常用类别型态

函式 /方法 单元文件

说明DayOfTheYear(TDateTime AValue) DateUtils

以数字形式回传 AValue日期为该年的第几天。DaysBetween(TDateTime ANow, TDateTime AThen) DateUtils

回传两个日期间的天数。以整数型态回传。DaysInAMonth(Word AYear, Word AMonth) DateUtils

回传指定年份 (AYear)月份 (AMonth)的天数。 AYear的范围为 1~9999 ;AMonth的范围为 1~12。DaysInAYear(Word AYear) DateUtils

以整数型态回传指定年份 (AYear)的天数。

Page 33: 综合基础  从 C/C++ 到 C++ Builder

33

1-3. 常用类别型态函式 /方法 单元文件说明DecodeDate(TDateTime DateTime, Word &Year, Word &Month, Word &Day); SysUtils

透过指标方式,以 Year 、 Month 、 Day三个参数回传指定日期的年、月、日。EncodeDate(Word Year, Word Month, Word Day) SysUtils

输入 Year 、 Month 、 Day变量值,回传代表输入日期的 TDateTime型别。EncodeDateDay(const Word AYear, const Word ADayOfYear)

DateUtils

输入年份和该年的第几天,回传一个代表输入日期的 TDateTime型别。EncodeDateMonthWeek(Word AYear, Word AMonth, Word AWeekOfMonth, Word ADayOfWeek) DateUtils

输入年份、月份、该月的第几个礼拜和该礼拜的第几天,回传代表该日期的TDateTime型别。

Page 34: 综合基础  从 C/C++ 到 C++ Builder

34

1-3. 常用类别型态

函式 /方法 单元文件说明EncodeDateWeek(Word AYear, Word AWeekOfYear, Word ADayOfWeek) DateUtils

输入年份、该年的第几个礼拜和该礼拜的第几天,回传 TDateTime型别表示该日期,其中, ADayOfWeek以星期一为 1、星期二为 2,依此类推。IncAMonth(Word &Year, Word &Month, Word &Day, int NumberOfMonths) SysUtils

对指定日期加上指定的月份,并透过传址变量回传新的日期。IncMonth(TDateTime Date, int NumberOfMonths = 1) SysUtils

对指定日期加上指定的月份,默认值为加上 1个月。IncDay(TDateTime AValue, int ANumberOfDays) DateUtils

指定日期加上指定的天数,回传值为 TDateTime型态。

Page 35: 综合基础  从 C/C++ 到 C++ Builder

35

1-3. 常用类别型态函式 /方法 单元文件说明

IsInLeapYear(TDateTime AValue) DateUtils

判断指定的日期是否为闰年,回传值为 True表示为闰年。IsToday(TDateTime AValue) SysUtils

判断指定日期是否为目前日期,如果是则回传 True。MonthOf(TDateTime AValue) SysUtils

回传指定日期的月份,范围值 1~12。RecodeDate(TDateTime AValue, Word AYear, Word AMonth, Word ADay)

DateUtils

依照指定的年月日对原有的日期进行修改,回传值为新的日期,型别为TDateTime。

Page 36: 综合基础  从 C/C++ 到 C++ Builder

36

1-3. 常用类别型态

函式 /方法 单元文件说明RecodeDay(TDateTime AValue, Word ADay) DateUtils

依照 ADay的输入修改 AValue的日期,回传值为 TDateTime型别的新日期。RecodeMonth(TDateTime AValue, Word AMonth) SysUtils

依照 AMonth的输入修改 AValue的日期,回传值为 TDateTime型别的新日期。RecodeYear(TDateTime AValue, Word AYear) SysUtils

依照 AYear的输入修改 AValue的日期,回传值为 TDateTime型别的新日期。WeekOf(TDateTime AValue) DateUtils

回传指定日期在该年中的第几个星期,为一整数型态的回传值。

Page 37: 综合基础  从 C/C++ 到 C++ Builder

37

1-3. 常用类别型态

函式 /方法 单元文件说明

WeekOfTheMonth(TDateTime AValue) DateUtils

回传指定日期在该月的第几个礼拜,为一整数型态的回传值。WeekOfTheYear(TDateTime AValue) SysUtils

回传指定日期在该年的第几个礼拜,为一整数型态的回传值。WeeksBetween(TDateTime ANow, TDateTime AThen) SysUtils

回传 ANow 和 AThen两日期的星期间格,为一整数的回传值。YearOf(TDateTime AValue) DateUtils

回传指定日期的年份,回一整数的回传值。

Page 38: 综合基础  从 C/C++ 到 C++ Builder

38

1-3. 常用类别型态

– 常用时间处理函式 /方法

函式 /方法 单元文件说明HoursBetween(TDateTime ANow, AThen) DateUtils

回传两个指定时间的时差,不包含小数部分。HourSpan(TDateTime ANow, TDateTime AThen) DateUtils

回传两指定时间间的时差,包含小数部分。HourOf(TDateTime AValue) DateUtils

回传时间的小时部分,范围值为 0~23。HourOfTheWeek(TDateTime AValue); DateUtils

回传指定日期为该周的第几个小时,计算基准为星期一的 AM12:00。

Page 39: 综合基础  从 C/C++ 到 C++ Builder

39

1-3. 常用类别型态函式 /方法 单元文件说明

IncHour(TDateTime AValue, __int64 ANumberOfHours) DateUtils

从 AValue日期加上指定的小时数, __int64 为 64bits的长整数。IncMinute(TDateTime AValue, __int64 ANumberOfMinutes) SysUtils

从 AValue日期加上指定的分钟数, __int64 为 64bits的长整数。IncSecond(TDateTime AValue, __int64 ANumberOfSeconds) SysUtils

从 AValue日期加上指定的秒数, __int64 为 64bits的长整数。MinutesBetween(TDateTime ANow, TDateTime AThen) DateUtils

回传两 TDateTime变量间的分钟数差,回传值为 __int64型态的长整数。

Page 40: 综合基础  从 C/C++ 到 C++ Builder

40

1-3. 常用类别型态

函式 /方法 单元文件说明MinutesSpan(TDateTime ANow, TDateTime AThen) DateUtils

回传两 TDateTime变量间的分钟数差,包含小数部分,以浮点数回传。MinuteOf(TDateTime AValue) DateUtils

以整数型态回传 TDateTime变量的分钟数,该值介于 0~59。MinuteOfTheDay(TDateTime AValue) DateUtils

回传从同一天 AM12:00算起到 TDateTime变数的分钟数。MilliSecondsBetween(TDateTime ANow, TDateTime AThen) DateUtils

回传两 TDateTime变数间的毫秒数差,以 __int64长整数回传。

Page 41: 综合基础  从 C/C++ 到 C++ Builder

41

1-3. 常用类别型态

函式 /方法 单元文件说明

SecondsBetween(TDateTime ANow, TDateTime AThen) DateUtils

回传两 TDateTime变数间的秒数差,以 __int64长整数回传。SecondSpan(TDateTime ANow, TDateTime AThen) SysUtils

回传两 TDateTime变量间的秒数差,包含小数部分,以浮点数型态回传。SecondOf(TDateTime AValue) SysUtils

以整数型态回传 TDateTime变量的秒数,该值介于 0~59。

Page 42: 综合基础  从 C/C++ 到 C++ Builder

42

1-4. 例外处理机制

• 在写程序时,难免因为考虑不周而产生一些特殊情形才会发生的错误,造成计算机的不稳定,为了避免这样的情形发生,C++ Builder 提供了例外处理机制来确保程序的稳定执行。所谓的例外处理机制在于程序执行时拦截所有可能发生的错误,并产生对应的例外错误事件,这事件中纪录了错误的类型与说明,而由于错误已经被拦截,所以可以在不影响系统的稳定和资源下跳过错误指令继续执行程序,至于拦截到的讯息则可以提供原设计师做为改正程序的参考,底下为基本的例外处理范例:

Page 43: 综合基础  从 C/C++ 到 C++ Builder

43

1-4. 例外处理机制

void __fastcall TForm1::Button1Click(TObject *Sender)

{

try

{

int i=Edit1->Text.ToInt();

ShowMessage(10/i);

}

catch (EDivByZero &E) //例外处理{

MessageDlg(E.Message, mtError,TMsgDlgButtons() << mbYes << mbNo, 0);

}

}

Page 44: 综合基础  从 C/C++ 到 C++ Builder

44

1-4. 例外处理机制

– 在 try{} 中的程序代码即为被例外处理机制所监督的程序区块,而catch{} 中的程序代码则为例外发生时所要执行的程序内容

– 以上面的例子来说,当 Edit1->Text 为 0 时会发生除数为 0 的错误• 而为了避免除数为 0 错误对程序执行可能造成的影响,我们使用 catch

来监督 EDivByZero( 除数为 0)错误类别的发生,其中 EDivByZero为专门监督除数为 0 错误的例外处理类别,当除数为 0 的错误发生后就会自动进入 catch区块中执行程序,并跳过 try{}区块中程序执行错误后面的程序代码,下面为 Exception错误发生的消息框。

Page 45: 综合基础  从 C/C++ 到 C++ Builder

45

1-4. 例外处理机制

– 上面程序片段中使用了 EDivByZero 例外处理类别解决了除数为 0 的错误,而 C++ Builder 还提供了其它的例外处理类别来解决不同的例外事件,下面为常见的例外处理类别。

例外处理类别 例外说明EAccessViolation 错误的内存存取。EComponentError

不正当的修改组件名称。

EConvertError String 或 object的转换错误。EDatabaseError 数据库存取错误。EDBEditError 数据库数据编辑错误。EDivByZero 除数为 0的错误。EInOutError 档案 I/O错误。

Page 46: 综合基础  从 C/C++ 到 C++ Builder

46

1-4. 例外处理机制

例外处理类别 例外说明

EIntOverflow 整数 Overflow的错误

EInvalidCast 不当的类别转换错误。

EInvalidGraphic 使用未知图档类型的错误。

EInvalidOperation 在组件上不当的操作错误。

EInvalidPointer 指标操作不当所造成的错误。

EPrinterError 打印错误。

EPropertyError 设定错误的组件属性值所产生的错误。

Page 47: 综合基础  从 C/C++ 到 C++ Builder

47

1-4. 例外处理机制

– 倘若一个程序区块内可能发生两种不同类型的错误,而对于这两种错误希望能分别处理,则可以透过多次的 catch 使用来撰写不同的处理内容

void __fastcall TForm1::Button1Click(TObject *Sender){

try {

int i=Edit1->Text.ToInt();

Edit1->Text=AnsiString(10/i);

}

catch (EDivByZero &E) { //除数为 0的例外处理MessageDlg(E.Message, mtError,TMsgDlgButtons() << mbYes << mbNo, 0);

}

catch (EConvertError &E) { //Edit1->Text转换成整数的例外处理MessageDlg(E.Message, mtError,TMsgDlgButtons() << mbYes << mbNo, 0);

Edit1->Text=AnsiString(10/1);

}

}

Page 48: 综合基础  从 C/C++ 到 C++ Builder

48

1-4. 例外处理机制

– 上面的程序代码利用两个 catch{}区块处理了两种不同的错误,在每个例外处理中加入对应的程序代码,这种将不同例外处理交由不同 catch{}区块来处理的好处就是可以针对错误类型进行特别处理,如加入对应的中文错误讯息说明或错误的自动校正功能,至于不针对特定类别的例外处理可使用下面的范例来监督所有可能的例外发生。

void __fastcall TForm1::Button1Click(TObject *Sender){

try {

int i=Edit1->Text.ToInt();

Edit1->Text=AnsiString(10/i);

}

catch (Exception &E) { //不特别指定例外处理的类别MessageDlg(E.Message, mtError,TMsgDlgButtons() << mbYes << mbNo, 0);

}

}

Page 49: 综合基础  从 C/C++ 到 C++ Builder

49

1-4. 例外处理机制

• 或

void __fastcall TForm1::Button1Click(TObject *Sender)

{

try

{

int i=Edit1->Text.ToInt();

Edit1->Text=AnsiString(10/i);

}

catch (...) //不特别指定例外处理的类别{

ShowMessage("Error");

}

}

Page 50: 综合基础  从 C/C++ 到 C++ Builder

50

1-4. 例外处理机制

– 除了程序执行过程因为错误发生而进入例外处理机制外,对于一些特殊的应用,我们亦可透过 throw 方法的呼叫来强迫例外处理类别的产生,进而引发对应的例外处理机制,底下为 throw 使用的范例。

try{

throw EDivByZero("Division Error");

}

catch(Exception &E){

ShowMessage(E.Message);

}

Page 51: 综合基础  从 C/C++ 到 C++ Builder

51

1-5. 类别转换机制

• C++ Builder 对于不同类别提供了一个转换的机制– 也就是 dynamic_cast 的使用,透过 dynamic_cast 可以把某种对象的类别

强制转换成另一种类别,但两类别间的转换不保证能确实完成• 为此, dynamic_cast 提供了安全保护机制来确保纵使转换失败也不影

响系统的运作,也就是说若转换不成功只是无法达成转换的目的,但不致造成系统的当机。 dynamic_cast 的语法:

• 其中参数 T为所欲转换的型态,必须为指针、 void* 或是定义过的类别才行,而 ptr参数则为原来的型态,必须为指针或是参考 (reference) ,至于转换错误则回传一个值为 0 的指标,下面为 dynamic_cast 的范例。

• 透过转换机制把 TForm 类别的 ActiveMDIChild 转成了 TImageForm类别,并指到 ptrImageForm 。

dynamic_cast <T> (ptr)

TImageForm *ptrImageForm = dynamic_cast<TImageForm *>(ActiveMDIChild);

Page 52: 综合基础  从 C/C++ 到 C++ Builder

52

本章习题

• 习题1. 如何从整数型态变量所占的内存大小来推算该型态所允许的数值。2. __int64 使用 64bits 来纪录数值的大小,试问它最大允许多大的数值输入。3. 简述 AnsiString 和字符串指针的不同。4. 试问 TDate 、 TTime 和 TDateTime 如何储存日期和时间的数据。5. 简述例外处理机制的优点。