Delphi4学习笔记Win32基础篇节选.docx
- 文档编号:9379892
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:71
- 大小:355.73KB
Delphi4学习笔记Win32基础篇节选.docx
《Delphi4学习笔记Win32基础篇节选.docx》由会员分享,可在线阅读,更多相关《Delphi4学习笔记Win32基础篇节选.docx(71页珍藏版)》请在冰豆网上搜索。
Delphi4学习笔记Win32基础篇节选
第1章
Delphi使用概論
本書的第一章在內容上力求淺顯,其中甚至有一步接一步的操作說明,即使是從來沒有使用過Delphi的程式設計師,閱讀本章相信也不至於有任何問題。
我在這一章中示範性的完成一個簡單的應用程式,除了用以說明典型的Delphi的程式開發流程,並且也以這個實例探討Delphi專案是由哪些檔案所組成,接著是與寫作程式息息相關的工具,包括程式編輯器(ProgramEditor)、除錯器(Debugger)的使用等等。
Delphi程式開發流程
典型的Delphi應用程式開發流程大致上可分為以下兩大步驟:
☐設計包括視窗外觀、主選單、按鈕等等的使用者操作介面。
☐撰寫使用者操作介面引發的事件處理程序以及其他相關程式。
上述的兩大設計工作不論是介面的設計或者程式的撰寫,都是在所謂的整合開發環境(IDE,IntegratedDevelopmentEnvironment)中進行的,此環境不僅能在設計階段就對未來成品的外觀擁有立即的視覺效果,其他的開發工具如程式編輯器與除錯器等也都整合在同一個環境中隨手可得。
關於這些我在本章將會一一加以說明,首先,讓我們快速的瀏覽一遍Delphi的整合開發環境。
介紹Delphi的整合開發環境
Delphi在啟動後,會自動幫我們建立一個新的專案,內含一個空白的視窗(按Delphi的說法是:
Form),此時,整合開發環境的外觀大致如圖1-1所示:
圖1-1/Delphi4的整合開發環境
圖1-1中明顯看得到的工具還有:
☐Speedbar,快速工具列。
☐ComponentPalette,元件盤。
☐ObjectInspector,物件檢視器,用來檢視並調整Form或Form上頭各元件的屬性值。
☐CodeEditor,程式編輯器,我們在此編輯區編修程式。
☐CodeExplorer,程式瀏覽器,一個以樹狀階層式用來表達專案各物件(Object)、方法(Method)以及參照到哪些單元(Unit)的工具,利用它,不僅專案的結構一目瞭然,以滑鼠在特定項目點兩下,CodeEditor將叫出其所屬程式。
設計的流程通常是這樣的:
建立一個新的專案──
接著在元件盤選擇需要的元件並將其一一放置到Form上
滑鼠拖曳調整各元件的大小與位置,或使用ObjectInspector調整元件的其他屬性內容
以ObjectInspector指定各元件的事件處理程序
在CodeEditor編修事件處理程序以及其他處理程式
【Run/Run】(或者按F9)測試執行。
這樣的說明對於第一次使用Delphi的讀者而言可能還不夠具體,接下來,我將配合圖1-2逐項加以說明。
圖1-2/使用Delphi整合開發環境設計使用者操作介面
放置元件
當然啦!
你一定會先考慮程式外觀大概長什麼樣子有什麼功能,正式動手時,頭一件事就是將所需的元件一一放進Form上頭。
方法很簡單:
點一下右上角元件盤裏頭的元件,然後在Form上點一下,元件會以其預設的大小出現在Form上頭;或者,你也可以在選擇元件後,直接在Form上頭以滑鼠拖曳的方式拉出元件的大小與位置。
VCL/元件
物件(Object)是根據類別(Class)建立的,這些物件可以在DelphiIDE設計階段放入Form中的我們稱之為元件(Component),Windows系統預先定義好的子視窗型態的控制項如按鈕、輸入盒等等,在Delphi也都以元件的面目出現。
要說Delphi的程式是由一個又一個元件拼湊起來的並不為過,就像IC安插到主機板,這些元件可以很順利地併進我們程式中並與其他元件共同合作。
IDE右上角元件盤裏頭出現的就都是預備為我們所用的元件,它們都來自於一個結構緊密的ApplicationFramework,也就是VCL(VisualComponentLibrary)。
此外,凡是從標準VCL中的類別繼承,符合Delphi元件寫作規範可以安裝進元件盤裏頭的也叫元件,這類客製元件(CustomComponent)的數量相當龐大,網路上估計有萬餘個這類的元件。
當你放置元件到Form上頭時,程式編輯器中的變化是值得注意的──Delphi會在我們加入元件到Form中時,自動在TForm1這個類別(Class)裏幫我們加入這些元件的程式碼(如圖1-2);同時,不論是刪除元件或者更改元件名稱,介於TForm1=Class(TForm)與private保留字之間的原始碼也會相應改變。
請注意!
介於TForm1=Class(TForm)與private保留字之間的原始碼是由Delphi自動負責維護的,除非是有把握,否則應該避免手動增刪這段程式的內容。
改變元件的大小與位置
設計使用者操作介面時,最常進行的動作大概就是改變元件的大小與位置了──直接以滑鼠拖曳Form上的元件就可以改變其位置(如圖1-2的第二步驟)。
滑鼠點一下Form上的元件時在元件四周將會有八個控點,拖曳這八個點可以改變元件的大小。
至於各個元件賴以寄存的Form,就當它是一般視窗逕行操作即可,拖曳視窗標題與邊緣分別可以改變Form的位置與大小。
設定元件的屬性值
事實上,以滑鼠改變元件的大小與位置,改變的不過只是元件眾多屬性其中的Left、Top、Width、Height等四個屬性而已,元件其他屬性值的指定在設計階段則透過ObjectInspector進行修改。
怎麼做呢?
如果你是一邊看書一邊練習,或者已經有過Delphi的設計經驗的話,應該已經注意到:
當滑鼠點按(Click)Form上頭的元件時,ObjectInspector會同步顯示該元件的屬性表;若是改從ObjectInspector的下拉式選單選擇某一元件時,Form上的相應元件也將同步被選取。
換句話說,Form上的元件與ObjectInspector會同時反應彼此的情況。
選取元件後,直接在Properties屬性表中對各屬性指定新值即可。
通常的情況是輸入數值或者文字(例如改變Button1的Caption),此外,某些屬性會提供下拉式選單讓我們選擇(例如Color屬性會出現色彩清單以供選擇),如果屬性的右端看到「…」按鈕,就表示點一下該按鈕會有對話盒協助設定該屬性的內容(例如Font屬性會出現字型設定對話盒)。
好了,現在你知道怎麼放元件,也知道該怎麼調整元件位置大小以及其他屬性,請練習一下吧──從元件盤的Standard分類標籤,分別選擇TLabel、TCheckBox、TButton等元件並放置到到Form中,另外,也放一個System分類標籤中的TTimer元件進去。
然後將操作畫面調整成圖1-3的樣子:
圖1-3/我的小時鐘的使用者操作介面設計完成圖
「我的小時鐘」各元件的屬性設定:
#0001objectfrmMyClock:
TfrmMyClock
#0002Left=371
#0003Top=146
#0004BorderIcons=[biSystemMenu,biMinimize]
#0005BorderStyle=bsSingle
#0006Caption='我的小時鐘'
#0007ClientHeight=70
#0008ClientWidth=369
#0009Font.Charset=CHINESEBIG5_CHARSET
#0010Font.Color=clWindowText
#0011Font.Height=-16
#0012Font.Name='細明體'
#0013Font.Style=[]
#0014Position=poScreenCenter
#0015PixelsPerInch=96
#0016TextHeight=16
#0017objectlblTime:
TLabel
#0018Left=8
#0019Top=8
#0020Width=56
#0021Height=16
#0022Caption='lblTime'
#0023end
#0024objectchkbxShowDate:
TCheckBox
#0025Left=8
#0026Top=40
#0027Width=97
#0028Height=17
#0029Caption='顯示日期'
#0030State=cbChecked
#0031TabOrder=0
#0032end
#0033objectbtnExit:
TButton
#0034Left=288
#0035Top=8
#0036Width=75
#0037Height=25
#0038Caption='&Exit'
#0039TabOrder=1
#0040OnClick=btnExitClick
#0041end
#0042objecttmrClock:
TTimer
#0043OnTimer=tmrClockTimer
#0044Left=336
#0045Top=40
#0046end
#0047end
上述的屬性設定表是怎麼來的呢?
基本上我也算是很懶的人,當然不會採用手動輸入這種又慢又容易出錯的方式。
想要取得Form與下轄元件各屬性之文字敘述時,請以滑鼠右鍵點一下Form,從彈出的快捷功能表選擇【ViewasText】即可;以滑鼠右鍵從從快捷功能表中選擇【ViewAsForm】,可還原回之前以Form為主體的設計模式。
沒錯,雖然基本上我的確是很懶的人,但是剛才的屬性表並沒有因為偷懶而漏列某些屬性。
事情是這樣的:
各元件的屬性值在元件的原始程式通常都會寫明其預設值,我們的檔案存檔時,只有與預設值不同的屬性才會被特別記錄下來以節省存取時間與檔案大小。
因此,雖然光是btnExit就有數十個屬性,剛才我們卻只看到六個。
寫作程式
好了,這個小時鐘已經初具外觀,雖然已經可以執行,點了按鈕也的確會看到它陷一下,然而,除此之外幾乎什麼事也沒做。
讓我們繼續為它加上程式處理。
「滑鼠點按」是一個「事件」,換句話說,有一個「按鈕被滑鼠點了一下」這件事發生了,當這件事發生時,應該有一個相應的處理程序接手此一事件的處理。
簡單地說,當滑鼠點一下按鈕時,我們的程式該有什麼反應。
請想像一下消防隊的情況,消防隊員並不會挨家挨戶不時地詢問是否有火警發生,而是平常就只是預備在那裏,隨時應付可能的突發狀況,電話進來了就觸發滅火的任務。
寫作視窗程式有點像是這樣,我們並不預期使用者會不會使用按鈕或者會先使用哪個按鈕,而只是單純的寫好這個按鈕被點到時該作的事。
以「我的小時鐘」為例,btnExit(從剛才的屬性設定可以看出我已經將Button1改名成btnExit了)是打算用來關閉frmMyClock的按鈕,它的點按事件(OnClick)處理程序怎麼寫呢?
操作程序是:
1.以滑鼠點一下frmMyClock(我們正在設計的Form)的btnExit按鈕。
2.然後是ObjectInspector,不同的是,這次我們並不是要改屬性,而是先點一下Event這個標籤,表中列出的是btnExit按鈕的事件表,其中的第一個是OnClick。
3.在OnClick的右邊點兩下。
輸入焦點此刻會立即切換到程式編輯器,相關的程序宣告都已經由Delphi預備妥當,游標也已準確的落到TfrmMyClock.btnExitClick程序的begin..end;中間,方便我們輸入程式。
4.此時請直接輸入「Close;」即可。
完成後的TfrmMyClock.btnExitClick事件處理程序如次頁所示:
#0001procedureTfrmMyClock.btnExitClick(Sender:
TObject);
#0002begin
#0003Close;
#0004end;
上述1-4的步驟可以「雙擊btnExit按鈕」代替,Delphi會自動採用該元件最常用的事件,以剛才的情況來說,就是btnExit按鈕的OnClick事件。
不過,直接雙擊某些元件會觸發該元件的ComponentEditor(例如,雙擊TImage元件會觸發載入圖形的對話盒),上述1-4的步驟是標準操作程序。
建議你在輸入close;之後,不妨以PageUp鍵往上多觀察一下程式編輯器的內容,會發現,現在TfrmMyClock=class(TForm)與第一個private保留字之間,除了原先的元件定義之外,如今又多了一列:
procedurebtnExitClick(Sender:
TObject);
原來如此,不僅畫面的設計十分視覺化,與操作介面相關的事件程序寫作也都很直覺地從這些元件下手,方便的是:
相關的程序宣告的瑣事都由Delphi代理了,程式設計師只要專注在「按鈕被點了一下」時該做寫的程式即可。
除了因為使用者的操作所引發的事件,系統也會送訊息給程式,這些訊息也都在於通知我們的程式某些需要加以處理的事件。
例如本例的TTimer元件,它會向系統申請一個計時器(Timer),每隔一段時間(本例採用元件預設值:
一秒鐘)Windows系統就會通知程式:
「喂喂!
時間到了喔!
」。
這種固定每秒鐘一次的事件對我們有什麼用?
對啦!
可以利用這個事件重新顯示畫面上的時間。
應用剛才在TfrmMyClock.btnExitClick學會的相同步驟,我寫作tmrClockTimer事件處理程序如下:
#0001procedureTfrmMyClock.tmrClockTimer(Sender:
TObject);
#0002begin
#0003ifchkbxShowDate.Checkedthen
#0004lblTime.Caption:
=DateTimeToStr(Now)
#0005else
#0006lblTime.Caption:
=TimeToStr(Now);
#0007end;
有新的東西喔!
程式要參考某一元件的屬性值,其語法格式是
元件參考.屬性
TfrmMyClock.tmrClockTimer事件處理程序就用這樣的語法取得chkbxShowDate.Checked的屬性值以得知使用者希望、不希望看到日期。
設計階段改變元件屬性值的方法是透過ObjectInspector,執行階段時則是採用:
元件參考.屬性:
=新值或運算式;
的指定敘述來改變元件的屬性值。
上述程式0004這列的Now函數會傳回當時的系統日期與時間,DateTimeToStr則是將其轉換成lblTime.Caption接受的文字型態資料。
這些是是Inprise的工程師們預先寫好放在SysUtils.pas程式單元(unit)的函數,我們直接以uses句子參照單元即可使用。
以uses參照其他單元的內容在ObjectPascal是個重要的觀念,關於這些目前我們暫時無需耽心,IDE己經幫我們寫好這些單元參照了,如果你夠細心(或者運氣夠好正好看到的話),會注意到單元開頭uses句子中的ExtCtrls本來並沒有,那是在加進了TTimer之後才自動加進去的。
有關程式單元的結構以及更多有關ObjectPascal的知識,留待稍候的第二、三兩章再陸續加以說明。
視覺化/非視覺化元件
元件可分為視覺化(VisualComponent)與非視覺化(Non-VisualComponent)兩類,差別在於執行階段視覺上能不能看得到而定。
請注意我的措詞,因為有些元件會有Visible這種布林(Boolean)型態的屬性,設為False時同樣也是看不到的。
所以,所謂非視覺化的元件指的是那些一定不能在執行階段看到的元件。
雖然看不到,但這些非視覺化元件元件是確實存在並且有作用的,例如本例的TTimer元件,雖然在圖1-4看不到,卻是主導「我的小時鐘」時間顯示的重要成員。
執行程式
好了,現在「我的小時鐘」己經完成了。
執行看看吧!
方法是:
Delphi主選單【Run/Run】;或者按下F9這個功能鍵;或者從Speedbar中點一下「Run」按鈕都可執行這支程式。
圖1-4是其執行情形:
圖1-4/我的小時鐘執行畫面
專案存檔
專案的存檔我留到最後才說,但是通常這個動作不會留到最後才做。
事實上,存檔的動作建議你越早作越好,怎麼說呢?
要回答這個問題前,我們得先看看「我的小時鐘」這個專案如何存檔:
5.從DELPHI主選單【File/SaveAll】,或者點一下Speedbar的「SaveAll」按鈕。
6.首先出現的是程式單元Unit1的存檔對話盒,請切換到任一個工作目錄(例如:
d:
\MyWork)或者乾脆為這個專案另外造一個新的目錄,然後,在檔名這欄中輸入MyClockU.pas,滑鼠點一下「存檔」按鈕即可完成原先Unit1的存檔。
7.單元存檔後緊接著會出現SaveProject1As的專案存檔對話盒,此時檔名請輸入MyClock.dpr,最後點一下「存檔」按鈕即可完成原先Project1的存檔。
看完這段時請先不忙著上機操作。
讓我先提醒你一邊操作時一邊留意專案存檔前後的一些變化:
首先,注意DelphiIDE的視窗標題原先是Delphi4-Project1,經由DELPHI主選單【Project/ViewSource】,在程式編輯器看到的專案原始碼是:
#0001programProject1;
#0002
#0003uses
#0004Forms,
#0005Unit1in'Unit1.pas'{Form1};
#0006
#0007{$R*.RES}
#0008...
存檔之後呢?
它會變成:
#0001programMyClock;//注意program名稱改變了
#0002
#0003uses
#0004Forms,
#0005MyClockUin'MyClockU.pas'{frmMyClock};//從Unit1變成MyClockU
#0006
#0007{$R*.RES}
#0008...
不僅如此,原先在程式程式編輯器中的Unit1從此也變成UnitMyClockU。
好了,現在可以回答為什麼存檔的動作我建議要先作了。
通常,一個專案不會像「我的小時鐘」這種簡單任務,而是同時含有好幾個單元(Unit),這些單元往往互相參考彼此的內容,參考時使用uses句子時一定得指定單元的名稱,因此,早點確定單元的名稱會比事後一一修改來得聰明些。
請不要用「記事本」或者Delphi的程式編輯器直接修改單元的名稱,否則下次開啟單元時會出現錯誤訊息,原因在於單元名稱與實際在磁碟上的檔名是關聯的,而且在.DPR專案檔中的記錄也將繼續留著過去的內容導致一些不愉快的錯誤。
更改單元名稱的正確作法是使用DELPHI主選單【File/SaveAs】,讓Delphi同時更動單元的名稱以及.DPR專案的相關設定。
Delphi專案組成的要素
「我的小時鐘」這個專案在磁碟裏產生了哪些檔案呢?
Delphi的專案第一次存檔時,在磁碟上將會產生以下幾個類型的檔案:
☐*.DFM,表格描述檔,其表頭是標準的Win16資源檔格式,檔頭之後是Form與內含元件的名稱與屬性等資料。
當我們在設計階段拖放元件到Form上頭並存檔時,這些元件與元件的屬性值就存入.DFM檔案之中。
簡單的說,一個Form的使用者介面是存在.DFM中,而其原始程式是放在.PAS。
☐*.PAS,程式單元檔,再白說一些的說法就是ObjectPascal的程式檔啦!
程式單元是ObjectPascal模組化程式的基礎,通常的規劃習慣是將大程式分割成一群群相關的函式,這些同類型的函式或者函數庫則依性質與功能分別組織到不同的程式單元。
以「我的小時鐘」為例,其MyClockU.pas即是一個程式單元,其內容都是有關於TfrmMyClock的類別定義以及其相關函式。
☐*.DOF,專案環境設定檔,有關整個專案例如CompilerDirective的設定與LibrarySearchpath等編譯與環境設定,就存在這個檔案裏頭。
檔案格式是一個普通文字檔,使用「記事本」即可觀看其內容。
☐*.RES,專案的視窗資源檔(ResourceFile),存放諸如程式名稱、程式圖像(Icon)等資源。
值得注意的是:
與專案相同主檔名的資源檔是由DelphiIDE負責維護,建議透過IDE主選單:
【Project/Options/Application】加以修改,避免使用其他的資源編輯工具修改其內容。
如果你想在程式中加入其他例如滑鼠指標的資源,應該另外取一個檔名並在程式中以{$Rfilename}這個CompilerDirective指示編譯器在連結時將這個自訂的資源檔併入執行檔中。
☐*.DPR,Delphi的專案檔,以Delphi主選單【Project/ViewSource】即可調閱其內容。
這個檔案不只記錄專案由哪些單元所組成,同時也是Delphi程式的進入點。
關於Delphi專案的結構,第二章會有更多的說明。
也許你會在專案存放目錄中會看到副檔名像是*.~PA、*.~DP的奇怪檔案,這些是*.PAS、*.DPR的備份檔。
專案第二次以後的存檔,Delphi會好心地替你保存前次修改的版本。
假如不要Delphi自動為你產生這些備份檔,經由DELPHI主選單:
【Tools/EnvironmentOptions/Display】,將Createbackupfile這個CheckBox清除即可。
專案在經過編輯連結後,還會產生出其他的檔案,它們分別是:
☐*.DCU,DelphiCompiledUnit,*.PAS在編譯過後會產生同名的*.DCU。
當程式要連結成EXE檔時,Delphi使用的是.DCU檔,也就是說,如果你有一個程式單元打算提供給其他人使用卻又不想公開原始程式的話,只給他DCU檔,對方還是可以使用該單元。
☐*.EXE,編譯過程中如果沒有發現錯誤,Delphi即會將專案中編譯過的DCU以及相關用到的RES、DFM等資源檔,連結成可執行檔。
如果你寫的是DLL,結果產生的就是.DLL,更多Delphi有關DLL的寫作與應用,請參照本書第十章的說明。
Delphi4出現之前,你在Delphi專案可以找到上述的檔案,Delphi4出現之後呢?
一個專案該有的檔案也還是這些。
不過,Delphi4與專案有關的檔案類型又多了一種,Delphi4可同時管理多個專案的這項特性,我預備在Win32進階篇時再詳細說明並加以應用,Win32基礎篇只應用單一專案就夠用了,在此我先以一個情節說明為什麼需要這種檔案並且提供一則簡單的操作實例:
Delphi4.0之前的版本,整合開發環境(IDE)一次只能開啟一個專案檔,假如手上進行的工作不只一個專案檔,這樣的限制總讓人覺得不便。
舉例來說,如果你正在寫一個COMServer的程式,當然會希望同時也叫出COMClient的專案進行測試,需要修改程式時,若不是來回開啟不同的專案檔,就只好啟動兩次Delphi,分別開啟不同的專案檔。
自Delphi4起,我們終於可以同時管理好幾個相關的專案,經由將專案加入到所謂的ProjectGrou
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi4 学习 笔记 Win32 基础 节选
![提示](https://static.bdocx.com/images/bang_tan.gif)