540 likes | 974 Views
第三章從 C/C++ 到 C++ Builder. 為了強化 C++ Builder 的功能, C++ Builder 透過類別的形式提供了大量的 VCL 元件,不但加速了程式的開發,也方便了程式的維護,但相對的也衍伸出許多 C/C++ 中所沒有的資料型態和處理機制。本章將針對常用的型態與機制進行介紹,讓讀者熟悉 C++ Builder 的特有語法,也充分利用 C++ Builder 的強大功能。. 大綱. 3-1. 基本資料型態 3-2. AnsiString 型態 3-3. 常用類別型態 3-4. 例外處理機制 3-5. 類別轉換機制. 3-1. 基本資料型態.
E N D
第三章從C/C++到C++ Builder 為了強化C++ Builder的功能,C++ Builder透過類別的形式提供了大量的VCL元件,不但加速了程式的開發,也方便了程式的維護,但相對的也衍伸出許多C/C++中所沒有的資料型態和處理機制。本章將針對常用的型態與機制進行介紹,讓讀者熟悉C++ Builder的特有語法,也充分利用C++ Builder的強大功能。
大綱 • 3-1. 基本資料型態 • 3-2. AnsiString型態 • 3-3. 常用類別型態 • 3-4. 例外處理機制 • 3-5. 類別轉換機制
3-1. 基本資料型態 • C/C++中紀錄基本資料型態所使用的記憶體大小會隨著編譯器的不同而有所不同,進而影響資料型態所能儲存的資料,底下為C++ Builder中對整數和浮點數基本型態的定義,包括使用的位元空間和所能表示的數值。
3-1. 基本資料型態 • 浮點數: • 此外,C++ Builder和C/C++最大的差別在於它提供了對字串的支援,而非C/C++中使用的字元陣列或是字串指標,且在C++ Builder視窗環境中,使用字串的機會遠比字元陣列或是指標大的多,在3-2節中我們將有對字串的完整介紹。
3-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變數,底下為幾種宣告的示範:
3-2. AnsiString資料型態 • 從上面的表格中可知,基本型態的數值幾乎都可以轉成AnsiString型態,而除了使用建構子達成轉換的目的外,C++ Builder還提供AnsiString和基本型態的轉換函式,列表如下:
說明: FloatToStr和FloatToStrF的差別在於FloatToStrF可依照指定格式進行轉換,格式為FloatToStrF(Extended Value, TFloatFormat Format, int Precision, int Digits),其中Value為浮點數;Format設定轉換格式;Precision指定精確度;Digits設定顯示小數位數。
3-2. AnsiString資料型態 • 除了可以自由轉換成熟悉的基本型態外,AnsiString相較於字串指標最大的優點在於可以使用運算元直接進行運算,使用方式就如同一般的基本型態,而不像字串指標的所有運算都必須靠函式的呼叫來完成
3-2. AnsiString資料型態 • 至此,可發現AnsiString不但可任意轉換型態,還能進行運算比較,比過去C/C++中使用的字串指標來的方便,但好戲還不止於此,C++ Builder對AnsiString型態提供了眾多的字串處理函式,讓基本的字串處理工作變的輕輕鬆鬆,這些函式將在下一小節說明。 • 3-2-2. AnsiString字串處理函式 • AnsiString字串處理函式包羅萬象,下面僅就常用的函式進行說明和示範:
3-2. AnsiString資料型態 • 習慣了AnsiString型態和其提供的方法後,會發覺AnsiString在很多情況下都比過去的字串指標來的方便,尤其是在VCL元件屬性或方法設定上,但缺點就是所寫的程式碼不能在其他編譯器下進行編譯。
3-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類別的屬性和方法將有助於後面元件的開發。
3-3. 常用類別型態 • 常用屬性:
3-3. 常用類別型態 • 常用方法: • 3-3-2. 參數類別 • 參數類別包含TParam和TParams兩種,其中TParam紀錄個別參數的內容,如Name=Value,而TParams則為TParam的集合,儲存了多個的參數內容。在C++ Builder中,很多資料庫元件都以TParams類別作為傳遞參數的依據,而TParams類別再透過其內的TParam傳遞每個參數和對應的值,如TQuery、TADOuery和TSQLQuery元件,底下為TParam和TParams常用的屬性與方法:
3-3. 常用類別型態 • TParam類別 • 常用屬性:
3-3. 常用類別型態 • TParams類別 • 常用屬性: • 常用方法:
3-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提供了一些好用的方法或函式來方便你設定時間類別的值或是做些時間上的判斷,如下所示:
3-3. 常用類別型態 • 取得日期部分
3-3. 常用類別型態 • 常用日期處理函式/方法
常用時間處理函式/方法 3-3. 常用類別型態
3-4. 例外處理機制 • 在寫程式時,難免因為考慮不周而產生一些特殊情形才會發生的錯誤,造成電腦的不穩定,為了避免這樣的情形發生,C++ Builder提供了例外處理機制來確保程式的穩定執行。所謂的例外處理機制在於程式執行時攔截所有可能發生的錯誤,並產生對應的例外錯誤事件,這事件中紀錄了錯誤的類型與說明,而由於錯誤已經被攔截,所以可以在不影響系統的穩定和資源下跳過錯誤指令繼續執行程式,至於攔截到的訊息則可以提供原設計師做為改正程式的參考,底下為基本的例外處理範例:
3-4. 例外處理機制 • 在try{}中的程式碼即為被例外處理機制所監督的程式區塊,而catch{}中的程式碼則為例外發生時所要執行的程式內容 • 以上面的例子來說,當Edit1->Text為0時會發生除數為0的錯誤 • 而為了避免除數為0錯誤對程式執行可能造成的影響,我們使用catch來監督EDivByZero(除數為0)錯誤類別的發生,其中EDivByZero為專門監督除數為0錯誤的例外處理類別,當除數為0的錯誤發生後就會自動進入catch區塊中執行程式,並跳過try{}區塊中程式執行錯誤後面的程式碼,下面為Exception錯誤發生的訊息方塊。
3-4. 例外處理機制 • 上面程式片段中使用了EDivByZero例外處理類別解決了除數為0的錯誤,而C++ Builder還提供了其他的例外處理類別來解決不同的例外事件,下面為常見的例外處理類別。
3-4. 例外處理機制 • 倘若一個程式區塊內可能發生兩種不同類型的錯誤,而對於這兩種錯誤希望能分別處理,則可以透過多次的catch使用來撰寫不同的處理內容
3-4. 例外處理機制 • 上面的程式碼利用兩個catch{}區塊處理了兩種不同的錯誤,在每個例外處理中加入對應的程式碼,這種將不同例外處理交由不同catch{}區塊來處理的好處就是可以針對錯誤類型進行特別處理,如加入對應的中文錯誤訊息說明或錯誤的自動校正功能,至於不針對特定類別的例外處理可使用下面的範例來監督所有可能的例外發生。
3-4. 例外處理機制 • 或
3-4. 例外處理機制 • 除了程式執行過程因為錯誤發生而進入例外處理機制外,對於一些特殊的應用,我們亦可透過throw方法的呼叫來強迫例外處理類別的產生,進而引發對應的例外處理機制,底下為throw使用的範例。