
cbuilderCH1624PPT课件.ppt
53页第三章從C/C++到C++ Builder為了強化C++ Builder的功能,C++ Builder透過類別的形式提供了大量的VCL元件,不但加速了程式的開發,也方便了程式的維護,但相對的也衍伸出許多C/C++中所沒有的資料型態和處理機制本章將針對常用的型態與機制進行介紹,讓讀者熟悉C++ Builder的特有語法,也充分利用C++ Builder的強大功能2021/8/311大綱•3-1.基本資料型態•3-2.AnsiString型態•3-3.常用類別型態•3-4.例外處理機制•3-5.類別轉換機制2021/8/3123-1.基本資料型態•C/C++中紀錄基本資料型態所使用的記憶體大小會隨著編譯器的不同而有所不同,進而影響資料型態所能儲存的資料,底下為C++ Builder中對整數和浮點數基本型態的定義,包括使用的位元空間和所能表示的數值型別位元大小(Bits)char8unsigned char8short int16unsigned short16int32long32enum32unsigned int322021/8/3133-1.基本資料型態•浮點數:•此外,C++ Builder和C/C++最大的差別在於它提供了對字串的支援,而非C/C++中使用的字元陣列或是字串指標,且在C++ Builder視窗環境中,使用字串的機會遠比字元陣列或是指標大的多,在3-2節中我們將有對字串的完整介紹。
型別位元大小(Bits)數值區間float321.18*10^-38<|X|<3.40*10^38double642.23*10^-308<|X|<1.79*10^308long double803.37*10^-4932<|X|<1.18*10^49322021/8/3143-2.AnsiString資料型態•在C++ Builder中的字串稱為AnsiString資料型態,該型態繼承至Delphi而來,原因在於C++ Builder共用了Delphi中的大部分VCL元件,而Delphi使用的Object Pascal語法擁有所謂的字串型態,為了能順利使用Delphi中的程式資源,所以繼承Delphi的字串型態(String)以方便對VCL元件進行設定的動作•3-2-1. 使用AnsiString–要建立一個AnsiString有很多方法,其中最簡單方式就是和基本型態一樣以宣告的方式建立一個AnsiString型態的變數,除此,亦可透過Constructor建構子的使用來產生一個AnsiString變數,底下為幾種宣告的示範:宣告/建構子範例AnsiString() 基本宣告AnsiString Str="Hello World!"AnsiString(const char* src)char *temp="Hello World!";AnsiString Str(temp);2021/8/3153-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);2021/8/3163-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");2021/8/317型態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設定顯示小數位數。
2021/8/3183-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];2021/8/3193-2.AnsiString資料型態–至此,可發現AnsiString不但可任意轉換型態,還能進行運算比較,比過去C/C++中使用的字串指標來的方便,但好戲還不止於此,C++ Builder對AnsiString型態提供了眾多的字串處理函式,讓基本的字串處理工作變的輕輕鬆鬆,這些函式將在下一小節說明。
•3-2-2. AnsiString字串處理函式–AnsiString字串處理函式包羅萬象,下面僅就常用的函式進行說明和示範:AnsiCompare函數宣告:int AnsiCompare(const AnsiString& rhs) const;說明:比較兩字串的內容:兩字串相同傳回0;小於傳回-1;大於傳回1範例:if(Edit1->Text.AnsiCompare("Hello")) ShowMessage("字串相等");2021/8/31103-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("字串相等");2021/8/31113-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);2021/8/31123-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",小數第三位四捨五入2021/8/31133-2.AnsiString資料型態FormatFloat函數宣告:AnsiString FormatFloat(const AnsiString Format, Extended Value);說明:依照Format格式轉換Value浮點數範例:Format格式說明12345-123450.80整數四捨五入12345-1234510.00小數兩位12345.00-12345.000.80#.##有值才顯示12345-12345.8#,##0.00千位分隔號12,345.00-12,345.000.80#,##0.00;(#,##0.00)正負號格式不同12,345.00(-12,345.00)0.800.000E+00符合格式的科學符號1.235E+05-1.235E+058.000E-012021/8/31143-2.AnsiString資料型態IntToHex函數宣告:AnsiString IntToHex(int Value, int Digits);說明:把整數轉成16進位的AnsiString。
範例:ShowMessage(IntToHex(168,2));//顯示的值為A8Insert函數宣告:AnsiString& Insert(const AnsiString& str, int index);說明:從字串的第index字元開始插入str字串,而原有index後的字串會往後挪移範例:AnsiString temp="Hello";temp.Insert(" World",6);//新增後的字元為"Hello World"2021/8/31153-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!");2021/8/31163-2.AnsiString資料型態LastDelimiter函數宣告:int LastDelimiter(const AnsiString& delimiters);說明:傳回字串中最後一個delimiters字串的位置範例:int pos=dirStr.LastDelimiter("\\");//傳回最後一個"\\"的位置IsEmpty函數宣告:bool IsEmpty();說明:判斷字串是否為空字串,是則回傳True範例:if(str.IsEmpty()) ShowMessage("String is empty");2021/8/31173-2.AnsiString資料型態Length函數宣告:int Length();說明:傳回字串的長度範例:int len=Edit1->Text.Length(); //Edit1輸入框中輸入字串的長度LastDelimiter函數宣告:int LastDelimiter(const AnsiString& delimiters);說明:傳回字串中最後一個delimiters字串的位置範例:int pos=dirStr.LastDelimiter("\\");//傳回最後一個"\\"的位置2021/8/31183-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字串內容轉為小寫2021/8/31193-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);2021/8/31203-2.AnsiString資料型態TrimLeft函數宣告:AnsiString TrimLeft();說明:去除字串中字頭所含的空白。
範例:Edit1->Text.TrimLeft();Trim函數宣告:AnsiString Trim();說明:去除字串的前後空白範例:Trim(Edit1->Text); 或Edit1->Text.Trim();TrimRight函數宣告:AnsiString TrimLeft();說明:去除字串中字尾所含的空白範例:Edit1->Text.TrimRight();2021/8/31213-2.AnsiString資料型態ToIntDef函數宣告:int ToIntDef(int defaultValue);說明:把字串轉成整數型態,轉換失敗則使用defaultValue作為輸出範例:int temp=str.ToIntDef(123);ToInt函數宣告:int ToInt();說明:把字串轉成整數,但字串內容不允許非數字字元的出現範例:int temp=str.ToInt();2021/8/31223-2.AnsiString資料型態–習慣了AnsiString型態和其提供的方法後,會發覺AnsiString在很多情況下都比過去的字串指標來的方便,尤其是在VCL元件屬性或方法設定上,但缺點就是所寫的程式碼不能在其他編譯器下進行編譯。
UpperCase函數宣告:AnsiString UpperCase();說明:把字串內的字元轉成大寫形式範例:AnsiString temp=str.UpperCase();2021/8/31233-3.常用類別型態•除了AnsiString字串型態外,C++ Builder為了元件的設定方便還提供了許多的類別型態,這些型態最常出現在元件的屬性或是方法指定上,底下我們僅就常用的TStrings、參數和時間相關類別型態進行介紹•3-3-1. TStrings型態–TStrings為一個以列表方式紀錄AnsiString型態資料的類別,也就是以陣列方式來儲存大量的AnsiString資料,所以舉凡能以條列方式顯示文字資料的VCL元件幾乎都透過TStrings型態來紀錄所要顯示的內容,包括:TListBox、TComboBox、TMemo和TStringGrid元件,像TListBox和TComboBox使用TStrings類別的Items屬性完成顯示內容的設定;TMemo使用Lines屬性;TStringsGrid使用Rows屬性此外,由於TStrings為一個類別而非基本型態,所以也提供了一些屬性和方法來增強TStrings類別的功能性,以方便程式設計員對它的使用,熟悉TStrings類別的屬性和方法將有助於後面元件的開發。
2021/8/31243-3.常用類別型態–常用屬性:屬性說明Count顯示目前TStrings中紀錄的字串數目CommaText以AnsiString型態顯示TStrings中的所有字串內容,字串間以逗點分隔Text以AnsiString型態顯示TStrings中的所有字串內容,但以斷行符號分隔不同字串Strings以陣列型態讀取TStrings內容,如Strings[0]Values當TStrings內容為Name=Value時,可以透過Values["Name"]的方式讀取對應的Value值2021/8/31253-3.常用類別型態–常用方法:•3-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是否相等2021/8/31263-3.常用類別型態–TParam類別•常用屬性:屬性說明AsString當參數為字串類型時,透過AsString指定參數值AsInteger當參數為整數類型時,透過AsInteger指定參數值AsFloat當參數為浮點數類型時,透過AsFloat指定參數值DataType設定TParam參數的類型,有ftString(字串)、ftInteger(整數)、ftDate(日期)、ftFloat(浮點數)、ftTime(時間)等Name設定參數的名稱Text把參數的值轉成字串形式呈現Value存取參數的值建議使用AsString、AsInteger、AsFloat、AsTime…等方式存取參數值能得到較好的效能)2021/8/31273-3.常用類別型態–TParams類別•常用屬性:•常用方法:屬性說明Items透過Items屬性紀錄參數的值Count回傳TParams中所紀錄的參數個數。
ParamValues透過ParamValues["Name"]方式傳回對應的參數值方法說明AddParam(TParam* Value)新增一個TParam參數到TParams中AssignValues(TParams* Value)以Value這個TParams設定目前的參數值IsEqual(TParams* Value)判斷兩個TParams是否相同2021/8/31283-3.常用類別型態•3-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提供了一些好用的方法或函式來方便你設定時間類別的值或是做些時間上的判斷,如下所示:2021/8/31293-3.常用類別型態–取得日期部分函式說明Now()以TDateTime類別回傳今天的日期和時間Date()以TDateTime類別回傳今天的日期Time()以TDateTime類別回傳今天的時間Today()以TDateTime類別回傳今天的日期Tomorrow()以TDateTime類別回傳明天的日期Yesterday()以TDateTime類別回傳昨天的日期CurrentYear()以四位整數回傳目前的西元年份2021/8/31303-3.常用類別型態–常用日期處理函式/方法函式/方法單元檔說明DateOf(TDateTime Value)DateUtils把TDateTime變數的時間部分歸零DayOf(TDateTime AValue)DateUtils回傳AValue所指定月份的天數DayOfTheMonth(TDateTime AValue)DateUtils和DayOf相同DayOfTheWeek(TDateTime AValue)DateUtils以數字形式回傳AValue日期為星期幾,1表示星期天,7表示星期六。
2021/8/31313-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~12DaysInAYear(Word AYear)DateUtils以整數型態回傳指定年份(AYear)的天數2021/8/31323-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型別2021/8/31333-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型態2021/8/31343-3.常用類別型態函式/方法單元檔說明IsInLeapYear(TDateTime AValue)DateUtils判斷指定的日期是否為閏年,回傳值為True表示為閏年IsToday(TDateTime AValue)SysUtils判斷指定日期是否為目前日期,如果是則回傳TrueMonthOf(TDateTime AValue)SysUtils回傳指定日期的月份,範圍值1~12RecodeDate(TDateTime AValue, Word AYear, Word AMonth, Word ADay)DateUtils依照指定的年月日對原有的日期進行修改,回傳值為新的日期,型別為TDateTime2021/8/31353-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回傳指定日期在該年中的第幾個星期,為一整數型態的回傳值2021/8/31363-3.常用類別型態函式/方法單元檔說明WeekOfTheMonth(TDateTime AValue)DateUtils回傳指定日期在該月的第幾個禮拜,為一整數型態的回傳值WeekOfTheYear(TDateTime AValue)SysUtils回傳指定日期在該年的第幾個禮拜,為一整數型態的回傳值WeeksBetween(TDateTime ANow, TDateTime AThen)SysUtils回傳ANow和AThen兩日期的星期間格,為一整數的回傳值YearOf(TDateTime AValue)DateUtils回傳指定日期的年份,回一整數的回傳值。
2021/8/31373-3.常用類別型態–常用時間處理函式/方法函式/方法單元檔說明HoursBetween(TDateTime ANow, AThen)DateUtils回傳兩個指定時間的時差,不包含小數部分HourSpan(TDateTime ANow, TDateTime AThen)DateUtils回傳兩指定時間間的時差,包含小數部分HourOf(TDateTime AValue)DateUtils回傳時間的小時部分,範圍值為0~23HourOfTheWeek(TDateTime AValue);DateUtils回傳指定日期為該週的第幾個小時,計算基準為星期一的AM12:002021/8/31383-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型態的長整數2021/8/31393-3.常用類別型態函式/方法單元檔說明MinutesSpan(TDateTime ANow, TDateTime AThen)DateUtils回傳兩TDateTime變數間的分鐘數差,包含小數部分,以浮點數回傳MinuteOf(TDateTime AValue)DateUtils以整數型態回傳TDateTime變數的分鐘數,該值介於0~59MinuteOfTheDay(TDateTime AValue)DateUtils回傳從同一天AM12:00算起到TDateTime變數的分鐘數MilliSecondsBetween(TDateTime ANow, TDateTime AThen)DateUtils回傳兩TDateTime變數間的毫秒數差,以__int64長整數回傳。
2021/8/31403-3.常用類別型態函式/方法單元檔說明SecondsBetween(TDateTime ANow, TDateTime AThen)DateUtils回傳兩TDateTime變數間的秒數差,以__int64長整數回傳SecondSpan(TDateTime ANow, TDateTime AThen)SysUtils回傳兩TDateTime變數間的秒數差,包含小數部分,以浮點數型態回傳SecondOf(TDateTime AValue)SysUtils以整數型態回傳TDateTime變數的秒數,該值介於0~592021/8/31413-4.例外處理機制•在寫程式時,難免因為考慮不周而產生一些特殊情形才會發生的錯誤,造成電腦的不穩定,為了避免這樣的情形發生,C++ Builder提供了例外處理機制來確保程式的穩定執行所謂的例外處理機制在於程式執行時攔截所有可能發生的錯誤,並產生對應的例外錯誤事件,這事件中紀錄了錯誤的類型與說明,而由於錯誤已經被攔截,所以可以在不影響系統的穩定和資源下跳過錯誤指令繼續執行程式,至於攔截到的訊息則可以提供原設計師做為改正程式的參考,底下為基本的例外處理範例:2021/8/31423-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); }}2021/8/31433-4.例外處理機制–在try{}中的程式碼即為被例外處理機制所監督的程式區塊,而catch{}中的程式碼則為例外發生時所要執行的程式內容–以上面的例子來說,當Edit1->Text為0時會發生除數為0的錯誤•而為了避免除數為0錯誤對程式執行可能造成的影響,我們使用catch來監督EDivByZero(除數為0)錯誤類別的發生,其中EDivByZero為專門監督除數為0錯誤的例外處理類別,當除數為0的錯誤發生後就會自動進入catch區塊中執行程式,並跳過try{}區塊中程式執行錯誤後面的程式碼,下面為Exception錯誤發生的訊息方塊。
2021/8/31443-4.例外處理機制–上面程式片段中使用了EDivByZero例外處理類別解決了除數為0的錯誤,而C++ Builder還提供了其他的例外處理類別來解決不同的例外事件,下面為常見的例外處理類別例外處理類別例外說明EAccessViolation錯誤的記憶體存取EComponentError 不正當的修改元件名稱EConvertErrorString或object的轉換錯誤EDatabaseError資料庫存取錯誤EDBEditError資料庫資料編輯錯誤EDivByZero除數為0的錯誤EInOutError檔案I/O錯誤2021/8/31453-4.例外處理機制例外處理類別例外說明EIntOverflow整數Overflow的錯誤EInvalidCast不當的類別轉換錯誤EInvalidGraphic使用未知圖檔類型的錯誤EInvalidOperation在元件上不當的操作錯誤EInvalidPointer指標操作不當所造成的錯誤EPrinterError列印錯誤EPropertyError設定錯誤的元件屬性值所產生的錯誤2021/8/31463-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); }}2021/8/31473-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); }}2021/8/31483-4.例外處理機制•或void __fastcall TForm1::Button1Click(TObject *Sender){ try { int i=Edit1->Text.ToInt(); Edit1->Text=AnsiString(10/i); } catch (...) //不特別指定例外處理的類別 { ShowMessage("Error"); }}2021/8/31493-4.例外處理機制–除了程式執行過程因為錯誤發生而進入例外處理機制外,對於一些特殊的應用,我們亦可透過throw方法的呼叫來強迫例外處理類別的產生,進而引發對應的例外處理機制,底下為throw使用的範例。
try{ throw EDivByZero("Division Error");}catch(Exception &E){ ShowMessage(E.Message);}2021/8/31503-5.類別轉換機制•C++ Builder對於不同類別提供了一個轉換的機制–也就是dynamic_cast的使用,透過dynamic_cast可以把某種物件的類別強制轉換成另一種類別,但兩類別間的轉換不保證能確實完成•為此,dynamic_cast提供了安全保護機制來確保縱使轉換失敗也不影響系統的運作,也就是說若轉換不成功只是無法達成轉換的目的,但不致造成系統的當機dynamic_cast的語法:•其中參數T為所欲轉換的型態,必須為指標、void*或是定義過的類別才行,而ptr參數則為原來的型態,必須為指標或是參考(reference),至於轉換錯誤則回傳一個值為0的指標,下面為dynamic_cast的範例•透過轉換機制把TForm類別的ActiveMDIChild轉成了TImageForm類別,並指到ptrImageFormdynamic_cast
2. __int64使用64bits來紀錄數值的大小,試問它最大允許多大的數值輸入3. 簡述AnsiString和字串指標的不同4. 試問TDate、TTime和TDateTime如何儲存日期和時間的資料5. 簡述例外處理機制的優點2021/8/3152部分资料从网络收集整理而来,供大家参考,感谢您的关注!。
