跨出「世紀末」的程式人
自從十九世紀末,兩位姓名已隱去的巴黎編劇人發明了「世紀未」這個詞,以後每一百年,人們就要在頹廢、焦慮、不安、躁切的情愫裡走一趙輪回。而在這個世紀,也開始有人提出了種種的世紀末口號,從「世紀末軟體革命」、「世紀末文化革命」到「世紀末XX革命」,似乎只要冠上「世紀末」就足以代表這個世代的所有情愫。
對於程式人來說,「世紀末軟體革命」指的是物件導向程式設計方法所帶來的思維模式的轉變(Paradigm Shift),它改變了程式寫作的思維模式,擴大了程式人的視野,有人把它和工業革命相比擬,認為它將會成為軟體業界的工業革命;然而,我們都知道,軟體業的工業革命還未到來。我們都在等待,也都在期待著黎明的曙光。
程式人的「創世紀」情結
「創世紀」是程式人的圖騰,它可以代表程式人個性中勇於創造的特質,它也曾經是許多程式人最愛的RPG(角色扮演游戲)。幾乎所有的程式人都喜愛並樂於享受創造物件的成就感,而這種熱中創造的特質,造就了許多優秀的程式。
在每個電腦世紀的交替中,都曾經產生一些創世紀的人物或產品司,其中Borland就是其中的一員。
Borland的霸王傳說
自從十五年前,Anders Hejlsber寫下了第一個Turbo Pascal編譯器以來,Borland就靠著Turbo Pascal穩定、優雅、與快速的編譯功能,加上當時的Pascal是資訊科系的「官話」,為欽定的教學語言,使得Borland成為雄霸一方的霸主。
隨著Turbo Pascal的成功,Borland乘勢而起,推出了Turbo C及Turbo C++,成為第二個在PC上推出商業化C++ 的編譯器廠商(第一個是Zortech C++,由C++ 之父Bjarne Stroustrup親自設計,現在已被Symantec收購)。這幾個成功的產品,將Borland的聲勢帶上高峰,於是為了更加打響Borland的名號,將旗下的所有產品,改冠以Borland之名,於是Borland的後續產品以Borland為名,如Borland C++,Borland Pascal篹.等等。
在Windows世紀開創之初,Borland C++ 3.1是當初唯一可以在Windows開發Windows軟體的程式發展工具,當時Borland還以此為號召,大力抨擊當時的MSC (Microsoft C)只能在Dos下撰寫Windows程式。然而隨著Visual C++ 的推出,情勢逆轉,在視覺發展工具的優勝劣敗下,Borland慢慢地喪失它既有的領土。
在這兩強對決的時代,Borland的開國功臣Turbo Pascal始終被遺忘在歷史的一個角落,然而它的開發小組也不是省油的燈,在經過了幾年的臥薪嘗膽之後,Anders Hejlsber再度帶領小組(這個小組似乎也不怎麽小篹.),石破天驚地推出了新一代的程式發展工具'Delphi ,這個以快速程式發展工具(RAD'Rapid Application Development)為號召的產品,一推出之後立即成為鎂光镫的焦點,成為拯救當時Borland的救火隊。
在Delphi推出之後,奠定了Borland在RAD領域的不朽地位,而Delphi也成為在PC上唯一可以和工作站級的Nextstep IB (Interface Builder )等量齊觀的重量級發展工具,不過這時開始有人在思考,什麽時候Borland會推出C++ 的快速程式發展工具。
在去年的Comdex展,Borland開始贈予一套代號為Ebony的程式發展工具,在幾經審閱之後,才發現它就是傳說中的Delphi for C++,也就是現在正式名稱為Borland C++ Builder, 簡稱為BCB的RAD。
Borland再次的開啟了一個RAD的戰場,和當初的Turbo Pascal一般,它的後繼者Delphi,是這場戰爭的先鋒,並且已為Borland贏得了多次的前哨戰,然後隨著C++ Builder的推出,Delphi這個打了勝仗的先鋒是否會如它的前身Turbo Pascal般沒入歷史中呢?
短期看來是不會的,因為BCB現在還算是喝Delphi的奶水長大的,它所使用的軟體元件都是以Delphi所撰寫的VCL元件(Visual Compoment Library),至於以後Borland會不會以BCB全盤改寫VCL呢?這是有可能的,那長期看來,BCB是否會取代Delhi呢?這似乎只能由時間來告訴我們了。不過Delphi之父Anders Hejlsber已經在去年由Borland離職了,這似乎透露了一些訊息。
說到這兒,我想您已經迫不及待地想要一睹C++ Builder的盧山真面目了,沒錯,今天這場RAD的戰爭已經開啟了,勝敗的的觀點已不是我們所關心的,我們所關心的是一個程式人的前哨站已經開打了,當別人都在使用C++ Builder這種重武器時,我們該如何因應?
既然無法反抗它,那就加入它! 讓我們參與C++ Builder 的創世紀吧!
離別Hello World的年代
許多電腦語言書籍入門書內的第一個程式都以一個印出Hello World字串的小程式作為第一個入門程式,而在Windows程式設計領域享有天王之名的Charles Petzold在他聖經級的著作的Programming Windows 中也是以一個Hello Window做為該書的開場白,在邁入C++ Builder的世紀之後,我就不再使用這種純古法饷造的方法來寫作了,為了充份讓您感受它的致命吸引力,現在我所展示的給您的第一個程式是多媒體撥放程式,而且我會告訴您如何在十分鐘之內寫出一個多媒體撥放程式,「十分鐘!有沒有搞錯?」,沒錯,就是十分鐘,用C++ Builder你絕對可以在十分鐘內寫出一個夠水准的媒體播放程式'即使你是一個菜得不能再菜的初學者。
它的執行畫面如下:
好戲開鑼啦!
在進入C++ Builder時你會看到以下的畫面
首先我簡單地為你介紹C++ Builder發展環境,在此我只對整個發展環境做一個簡單的浏覽,以利程式的撰寫。
C++ Builder發展環境主要分為以下元件:
(1)表格(Form)視窗
(2)元件盒(Compoment palette)
(3)物件檢視器(Object Inspector)
(4)程式編輯器(Code Editor)
(5)加速棒(SpeedBar)
表格視窗 (Form)
表格是C++ 程式設計的焦點,我們可以將表格視為一張畫布,在程式設計時,我們主要做的工作只是將程式元件放置在表格上而已。因此表格其實可視為一個包含其他元件的軟體元件。
元件盒(Compoment Palette)
軟體元件是你用以架構C++ Builder程式的基本元素。在C++ Builder中軟體元件依其元件特性分門別類地放置在活頁式的元件盒中,在C++ Builder中提供了超過了百種以上的基本元件,程式設計時,只要將元件盒內的軟體元件拖放至表格中即可。
物件檢視器(Object Inspector)
物件檢視器是用以改變物件的內容,改變該物件的行為模式以符合你的需要。物件的內容包含了屬性(Property)及其事件處理程式(Event Handler)。你可以視需要改變指定物件的狀態及行為模式。
程式編輯器(Code Editor)
C++ Builder的程式編輯器是一個全功能的編輯器,它讓你可以存取及編輯所有專案內的程式。
加速棒(SpeedBar)
加速棒(SpeedBar),顧名思義,它是用來加快程式的操作。C++ Builder將許多在功能表中常用的功能,在加速棒中以捷徑的方式提供你使用。
你的第一個C++ Builder程式
我們已經簡單地介紹了C++ Builder程式發展環境,現在我們要開始撰寫我們的第一個程式'媒體撥放程式。
設計表格
首先你要先設計你所要使用的表格長相。設計表格非常簡單,其實只是將軟體元件放在視窗中而已。以下我以幾個步驟示范表格的設計:
(1)開啟新表格
(2)將軟體元件置入表格中
(3)設定各個軟體元件的屬性
(4)執行程式
完成了以上的程序後,大抵一個程式也差不多設計完了。這也是C++ Builder的迷人之處。
開啟新表格
在進入C++ Builder後,它會自動為你開啟一個新的表格。此時表格開啟的工作就算完成了,若是要加入其他新的表格,只要執行[File/New Form]即可。
將軟體元件置入表格中
在開啟新表格後,你可以在元件盒中選取元件,置入表格中,在此要非凡說明的是,在C++ Builder的設計時期(Design Time)和執行時期(run time),大部份元件的行為模式幾乎是相同,所以在設計時你就可以看到程式執行的結果。
在我們的這個程式中,除了表格外,有一個元件包含了其它的元件,那就是活頁式表格元件(TabbedNoteBook),這個元件和表格類似,必須最早放入表格中以容納其他元件。
在我們的第一個程式中置入軟體元件後的結果如下:
你可以看到,除了因為沒有執行,所以沒有顯示動畫檔之外,它和執行的結果幾乎一模一樣。
首先我們來看看這個程式用到了那些元件。
TTabbedNoteBook 活頁式表格元件。位於元件盒的「Win3.1」頁,用以做出「動畫及音效 及|音樂CD 兩個表格。
Tlabel 標題元件。位於元件盒的「Standard」頁,用以顯示"媒體播放程式"字樣。
TPanel 面板元件。位於元件盒的「Standard」頁,用以顯示動畫圖形檔。
TMediaPlayer 媒體播放元件。位於元件盒的「System」頁,用以播放多媒體。
TDriveListBox 磁碟機列表元作 。位於元件盒的「System」頁,用以顯示磁碟機名。
TFilterComboBox 檔名過濾器元件。位於元件盒的「System」頁,用以過濾檔名。
TDirectoryListBox 目錄列表元件。位於元件盒的「System」頁,用以顯示目錄。
TFileListBox 檔案列表元作。位於元件盒的「System」頁,用以顯示檔案。
在使用這些元件時,請先至元件盒中選出欲使用的元件,然後將其拖放至表格中適當的位置,再改變元件的大小,如此你就可以得到一個表格的雛形了。
設定各個軟體元件的屬性
將軟體元件置入表格中之後,再來我們就要開始設定元件屬性了。為了要讓這些元件互相合作,我們必須設定它們之間的關系,在設定之前我們先仔細想想它們之間的動作模式:
(1)改變磁碟機後,目錄必須跟著改變。
(2)改變目錄後,檔案列表必須跟著改變。
(3)改變檔名過濾器後,檔案列表必須跟著改變。
在了解它們的關系後,我們就可以開始動手來設定它們的屬性了,設定屬性其實非常簡單,只要在表格上選取該元件時,物件檢視器就會顯示該物件所有的屬性,以磁碟機元件為例,當我們選取到該元件時,物件檢視器就會切換到如下圖所示的狀態:
此時你可以看到在物件檢視器顯示了磁碟機列表元件的屬性,其中我們感愛好的是「DirList」一項,你可以選取該欄位,此時你會發現它會出現一個列表,這個列表會將目前表格中所有的目錄列表元件顯示出來,因為我們所設計的表格中只有一個目錄列表元件,所以你只要選擇該列表中唯一的一個即可。
以上的動作所代表的意義就是:建立磁碟機列表元件和目錄列表元件之間的關系,當磁碟機改變時,必須通知目錄列表元件,使其跟著改變。
同理我們選取目錄列表元件,並設定其屬性,在目錄列表元件中我們感愛好的是「FileList」欄位,此時你可以選取該欄位,並將它設定為表格中的檔案列表元件。
以上的動作所代表的意義就是:建立目錄列表元件和檔案列表元件之間的關系,當目錄改變時,必須通知檔案列表元件,使其跟著改變至目前目錄的列表。
接著我們選取檔名過濾器元件,並設定其屬性,在檔名過濾器元件中我們感愛好的是「FileList」欄位,此時你可以選取該欄位,並將它設定為表格中的檔案列表元件。
以上的動作所代表的意義就是:建立檔名過濾器元件和檔案列表元件之間的關系,當檔名過濾器改變時,必須通知檔案列表元件,使其跟著改變至目前的檔案列表。
最後,我們要設定檔名過濾器元件的過濾,在這個程式中我希望可以播放AVI動畫檔及WAV音效檔,所以必須適當地設定檔名過濾器元件,
同樣地,我們首先選取檔名過濾器元件。
在這個元件中我們所感愛好的是其中的「Filter」屬性,因此我們在該項目上點二下,此時我們會看到如下的畫面:
如圖所示,我們將AVI動畫檔及WAV音效檔的過濾字元填入即可。在程式執行時,拉下檔名過濾器時所顯示的名稱,就是你所填入的過濾器,它會發揮把關的角色,使得只有符合條件的檔名顯示在檔案列表中。
完成了以上動作之後,你就已經將磁碟機及檔案列表元件設定完成了,此時你可以先行執行程式,看看其動作是否正確。執行程式的方法是在選取選單上的「Run/Run」,或是直接按「F9」即可。
如何?神奇吧!用C++ Builder寫程式就是這麽簡單。
再來我們思考多媒體播放程式的部份,我們希望它的動作方式如下:
(1)以TPanel來顯示動畫畫面。
(2)以多媒體播放元件來播放目前檔案列表中所選取的檔案。
(3)在檔案列表元件以雙擊(Double-Click)來播放該檔案。
首先我們先來看看多媒體播放元件的內容:
在多媒體播放程式中我們感愛好的是其中的「Display」項目。因此我們選取「Display」項目,此時你會看到所有在表格中可供顯示的元件:
我們希望將動畫畫面顯示在「Panel1」元件中,因此請你選擇「Panel1」項目。完成這個動作之後,媒體播放程式在播放動畫檔時會將畫面顯示在「Panel1」上。
接著我們設定播放的動作:
要設定播放的動作,你必須選取多媒體播放元件,並將物件檢視器切換至「事件(Events)」頁,然後在其中的OnClick上按兩下(Double-Click),接著C++ Builder會為你自動產生一段空的程式碼的,然後就切換至程式編輯器中。
以下的畫面即是C++ Builder切換的程式編輯器畫面,此畫面我已經填入了程式碼,你的程式應該是空的。
再來我們看看應該在其中填入那些程式碼呢?
void __fastcall TForm1::MediaPlayer1Click(TObject *Sender,
TMPBTnType Button, bool &DoDefault)
{
//以下為我們填入的程式碼
if (Button==btPlay)
{
MediaPlayer1->FileName=FileListBox1->FileName;
MediaPlayer1->Open();
MediaPlayer1->Play();
DoDefault=FALSE;
} else
DoDefault=TRUE;
}
以上我們填入的程式碼的主要動作就是:
(1)將媒體播放元件檔名指定為檔案列表元件目前的檔名。
(2)開啟媒體播放程式。
(3)開始播放。
進行到這兒,你可以再次執行程式。然後選取適當的檔案,在選好了檔案之後,你就可以在多媒體撥放元件中選擇執行
,若是你所選擇的是AVI動畫檔,你已經可以看到動畫播放在我們所指定的元件「Panel1」上了。
最後,我們希望再提供一種播放檔案的方式,那就是在檔案列表中以雙擊(Double-Click)的方式來播放指定檔案。此時我們可以選擇檔案列表元件,並將物件檢視器切換至事件頁,這時你會看到以下的畫面:
同樣地你可以在「OnDblClick」項目雙擊,此時C++ Builder會自動為我們產生程式碼,並且自動切換至程式碼編輯器中:
上圖即為程式碼編輯畫面,此畫面我已經填入了程式碼,你的應該是空的,接著你再於編輯器中填入以下的程式碼:
void __fastcall TForm1::FileListBox1DblClick(TObject *Sender)
{
MediaPlayer1->FileName=FileListBox1->FileName;
MediaPlayer1->Open();
MediaPlayer1->Play();
}
以上我們填入的程式碼的主要動作就是:
(1)將媒體播放元件檔名指定為檔案列表元件目前的檔名。
(2)開啟媒體播放程式的指定檔案。
(3)開始播放。
在完成了上述的操作之後,你可以再次地執行程式,選取欲播放的檔案,然後以雙擊的方式來執行檔案。
進行到這兒,你已經把握了C++ Builder程式設計的精神,也寫出了一個不錯的媒體播放程式。你是不是對C++ Builder的快速程式發展環境(RAD:Rapid Application Development)愈來愈有信心了呢?
接下來你會發現,到目前為止,我似乎沒有把這個范例程式完全解說清楚,因為前面的執行畫面中的活頁式表格元件中,還有另一頁是「音樂CD」的播放,另外關於「媒體撥放程式」這個字形的設定方式也沒有解說。
是的,沒錯,這些都是我打算留給你自行練習的項目,因為較之前面所述的幾個操作,它們都簡單多了,以下我先簡單透露幾個重點:
(1)選擇「活頁式表格」元件,並改變其「Pages」屬性。利用它所提供的編輯器,編輯頁數及名稱。
(2)將「ActivePage」切換至音樂CD頁,如前面所述加入一個多媒體播放元件。
(3)將多媒體播放元件的「Device Type」設定為CD Audio.
(4)撰寫播放程式碼。因為播放音樂CD不需要開檔,所以不需要指定檔案。
(5)設定各個標的字形。
完成了以上的動作後,你可以再度執行程式並切換「音樂CD」中,放入CD,然後就可以播放CD了。
你可以試著自行去打造你的程式畫面,以上的程式畫面都只用了簡單的標題元件及圖形元件而已,你可以嘗試著玩玩看。
以上就是我們用C++ Builder所撰寫的第一個程式,它是不是給了你一個全新的感受,原來Window 程式設計也可以是如此這般的輕松。
當然,這只是一個開始而已,在後續的單元中,我會繼續帶著你走進C++ Builder所架構的漂亮新世界,探索這種新的程式設計方法。