簡介
Delphi是美國Borland(寶蘭)公司開發的工作在Windows平台下的開發工具,它的前身是在DOS下的產品Borland Turbo Pascal。從產品名稱上就可以知道,Turbo Pascal使用的是Pascal語言。從Turbo Pascal 5.5版本開始,Borland公司在傳統Pascal的基礎上加入了面向對象的功能。
Delphi是一個集成開發環境(IDE),使用的是由傳統Pascal語言發展而來的Object Pascal語言。它在本質上是一個代碼編輯器而不是一種語言,但是由於Delphi是幾乎是市場上唯一一個使用Pascal語言的產品,因此有的時候Delphi也成為了人們稱呼Object Pascal的代名詞。Borland公司已經把Object Pascal語言改稱為Delphi語言。
功能特點
Delphi是Borland公司研發的可視化開發工具,可在Windows3.x、Windows95、WindowsNT、WindowsXP、WindowsVista、Windows7等環境下使用。當前,Delphi 也可以在LINUX平台上開發套用,其在LINUX上的對應產品Kylix。
Delphi 擁有一個可視化的集成開發環境(IDE),採用面向對象的程式語言ObjectPascal和基於部件的開發結構框架。Delphi它提供了500多個可供使用的構件,利用這些部件,開發人員可以快速地構造出套用系統。開發人員也可以根據自己的需要修改部件或用Delphi本身編寫自己的部件。
“真正的程式設計師用C++,聰明的程式設計師用Delphi”,這句話是對Delphi最經典、最實在的描述。Delphi被稱為第四代程式語言,它具有簡單、高效、功能強大的特點。和VC相比,Delphi更簡單、更易於掌握,而在功能上卻絲毫不遜色;和VB相比,Delphi則功能更強大、更實用。可以說Delphi同時兼備了VC功能強大和VB簡單易學的特點。它一直是程式設計師至愛的編程工具。Delphi具有以下的特性:基於窗體和面向對象的方法,高速的編譯器,強大的資料庫支持,與Windows編程緊密結合,強大而成熟的組件技術。但最重要的還是Object Pascal語言,它才是一切的根本。Object Pascal語言是在Pascal語言的基礎上發展起來的,簡單易學。
Delphi提供了各種開發工具,包括集成環境、圖像編輯(Image Editor),以及各種開發資料庫的應用程式,如DesktopDataBase Expert等。除此之外,還允許用戶掛接其它的應用程式開發工具,如Borland公司的資源編輯器(Resource Workshop)。
在Delphi眾多的優勢當中,它在資料庫方面的特長顯得尤為突出:適應於多種資料庫結構,從客戶機/服務機模式到多層數據結構模式;高效率的資料庫管理系統和新一代更先進的資料庫引擎;最新的數據分析手段和提供大量的企業組件。
版本
1995 1.0 支持16位Windows開發。基於框架(VCL)的,可拖曳、可視化的開發環境
1996 2.0 以32位編譯器為核心,支持C/S資料庫開發
1997 3.0 語法:加入接口(Interface)的機制。IDE:首次提供了(Code Insight)
1998 4.0 語法:加入動態數組和方法覆蓋等支持。IDE:增強調試能力,提供代碼模板
1999 5.0 增強了IDE和調試器,提供了TeamSource。簡化Internet的開發,增強資料庫支持
2001 6.0 提供了Web Service。跨平台的Kylix 1.0和CLX
2002 7.0 提供了.NET的過渡,增強的Internet開發(IntraWeb),完善資料庫支持,增加了Indy網路元件和Rave Report資料庫報表,並且支援UML及XP的程式製作。
2003 8.0 單純的for .NET版本,擁有C#的能力,保留了Delphi的易用性(業內視為一個過渡版本)
2004 9.0 正式名稱:Delphi 2005。語法:加入了inline及for in loop等功能。IDE:把Borland Delphi. Net、Borland Delphi Win32、Borland C#、Enterprise Core Objects等環境和功能集成成一個開發工具,因此可以在Win32和.NET開發環境中切換或同時進行
2005 10.0 發布名稱:Borland Developer Studio(BDS) 2006。集成C++ Builder; ECO(Enterprise Core Objects)升級到ECO III; 集成Together for Delphi,可以在同一個IDE中進行UML開發;QA Audits和QA Metrics可以快速的把握專案的設計和代碼的質量。
2006 Turbo Borland將BDS 2006拆分成幾個獨立的版本(Delphi for win32、Delphi for .net、C#、C++ Builder),而且不能同時安裝兩個不同的版本。由於Borland的IDE生產部份獨立成為一家名為codegear的公司,所以這個版本是以Borland名義推出的最後一個版本。
2007 11.0 正式名稱:CodeGear RAD Studio - Delphi 2007。
2008 5.7 Borland正式宣布將CodeGear子公司出售給Embarcadero(易博龍)技術公司。
2008 8.25 Embarcadero發布CodeGear Delphi 2009 Pre-release版。
2009 8.25 Embarcadero發布CodeGear.RAD.Studio.2010版
2010.8.30 Embarcadero 發布 Delphi XE(又名Delphi 2011,代號為Fulcrum)
2011.1.27 Embarcadero公司宣布成立一個新的精簡版Delphi Starter Edition,是在愛好者和誰得到一個稍微簡化的功能集為一個小的創業公司的價格,旨在可用性。
2011 年 發布Embarcadero RAD Studio XE2,支持跨平台,這項技術被稱為FireMonkey。
2012 年5月 英巴卡迪諾公司正式發布 Delphi XE3。
2013 年4月 發布Delphi XE4 ,ios編程得到完善。
2013 年9月 發布Delphi XE5 ,開始安卓開發。
2014 年3月 發布AppMethod 1.13,專注移動開發。
程式之父
Anders Hejlsberg,丹麥人,曾在丹麥科技大學學習工程學。Anders Hejlsberg第一次登上軟體界歷史舞台是在80年代早期,因為他為MS-DOS和CP/M設計了一個Pascal編譯器。當時,還是一個小公司的Borland很快雇用了他,並買下了他的編譯器,改稱Turbo Pascal。在Borland,Hejlsberg繼續開發Turbo Pascal,並最終帶領他的小組設計了Turbo Pascal的替代品、開發工具史上的奇蹟: Delphi語言。
特性
Delphi發展至今,從Delphi1、Delphi2到Delphi XE3,不斷添加和改進各種特性,功能越來越強大。Delphi5開始添加了對IDE(集成開發環境)的很多改進新特性,擴展了資料庫支持(ADO和InterBase資料庫),帶有Internet支持的MIDAS改進版,TeamSouse版本控制工具,轉換功能,框架概念以及很多的新組件與新特性。
Delphi 6.0是Borland公司推出的一套無論是界面還是功能都近乎完美的應用程式開發工具。與以前的Delphi版本相比,Delphi 6.0使用更簡便,效率也更高。
Delphi 7.0使用更簡便,效率更高,最穩定的一個版本,被稱為開發人員的工具之最,也是Borland產品最頂峰時期,更是風靡全球。
Delphi2010內置的Direct 2D模組及開發庫,其新加的功能:擁有一個能同時運作於x86和x64的IDE,在此IDE下將會有跨平台編譯器,能夠編譯用於linux和MAC的應用程式;將會支持windows7下的觸摸式編程;強化的DataSnap;將支持雲計算;將支持函式式編程,這需要很多時間,據David估計是2011會實現。
Delphi XE2實現了跨平台通用開發,通過Delphi XE2所帶的FireMonkey平台,Delphi可以開發跨平台應用程式,並原生編譯到Windows和Mac OS X平台。FireMonkey還可以為iPhone、iPod Touch和iPad創建iOS套用,並分發到蘋果公司的套用商店。Delphi的FireMonkey應用程式擁有完全的硬體加速。
Delphi XE3 可以發布不同平台的產品,包括Windows 7和Mac OS,未來還要支持手機版本的Android和IOS。
(1)直接編譯生成可執行代碼,編譯速度快。由於Delphi編譯器採用了條件編譯和選擇連結技術,使用它生成的執行檔案更加精煉,運行速度更快。在處理速度和存取伺服器方面,Delphi的性能遠遠高於其他同類產品。
(2)支持將存取規則分別交給客戶機或伺服器處理的兩種方案,而且允許開發人員建立一個簡單的部件或部件集合,封裝起所有的規則,並獨立於伺服器和客戶機,所有的數據轉移通過這些部件來完成。這樣,大大減少了對伺服器的請求和網路上的數據傳輸量,提高了套用處理的速度。
(3)提供了許多快速方便的開發方法,使開發人員能用儘可能少的重複性工作完成各種不同的套用。利用項目模板和專家生成器可以很快建立項目的構架,然後根據用戶的實際需要逐步完善。
(4)具有可重用性和可擴展性。開發人員不必再對諸如標籤、按鈕及對話框等Windows的常見部件進行編程。Delphi包含許多可以重複使用的部件,允許用戶控制Windows的開發效果。
(5)具有強大的數據存取功能。它的數據處理工具BDE(BorlandDatabaseEngine)是一個標準的中介軟體層,可以用來處理當前流行的數據格式,如xBase、Paradox等,也可以通過BDE的SQLLink直接與Sybase、SQLServer、Informix、Oracle等大型資料庫連線。Delphi既可用於開發系統軟體,也適合於套用軟體的開發。
(6)擁有強大的網路開發能力,能夠快速的開發B/S套用,它內置的IntraWeb和ExpressWeb使得對於網路的開發效率超過了其他任何的開發工具。
(7)Delphi使用獨特的VCL類庫,使得編寫出的程式顯得條理清晰,VCL是現在最優秀的類庫,它使得Delphi在軟體開發行業處於一個絕對領先的地位。用戶可以按自己的需要,任意的構建、擴充、甚至是刪減VCL,以滿足不同的需要。
(8)從Delphi8開始Delphi也支持.Net框架下程式開發。
當前DELPHI 已經成為一個品牌,而不僅僅是一個開發平台或開發語言的名稱。當前DELPHI產品已經由CodeGear公司繼續發展,該公司是BORLAND公司的全資子公司。當前,CodeGear為廣大開發者提供了DELPHI FOR PHP,以高度可視化的方式全面支持面向對象的PHP網站開發,大大提高了PHP開發網站的代碼復用程度,成為WEB套用開發的新利器。
安裝方法
Delphi的安裝與其它套用軟體並無不同。2.0版必須在Windows 95以上的作業系統中使用。啟動Windows 95或Windows NT後,將Delphi的光碟放入光碟機(CD-ROM)中,運行光碟上的\INSTALL\SETUP.EXE檔案,它的安裝程式會提示您正確地裝入Delphi。如果您是在微軟中文Windows環境中安裝Delphi,請參照附錄A來設定您的BDE環境,以便於處理中文數據。
為避免隱藏在Delphi後的Program Manager和曾經運行過的其它程式擾亂版面,分散您的注意力,不妨在啟動Delphi前關掉其它應用程式;啟動Delphi後,再最小化隱藏在後面的Delphi 2.0程式組。這樣螢幕上就只留下Delphi視窗可見了。
首次載入Delphi,螢幕上會出現四個視窗:
標題為“Delphi-Project1”的Delphi主視窗
Object Inspector視窗
標題為“Form1”的窗體(Form)視窗
標題為“Unit1.PAS”的代碼編輯視窗。剛啟動時這一視窗的大部分被“Form1”窗體所掩蓋。將“Form1”窗體移開,或單擊Form1窗體下方的狀態行,可以使其全部可見。在“Form1”窗體的任意可見位置單擊滑鼠,可以恢復主窗體可見。
Delphi的主視窗位於螢幕的上端,包括Menu(選單)、Speed Bar(加速條)和Component Panel(部件選項板)。Menu是下拉式主選單。Speed Bar位於主視窗的左下端,由兩排共14個加速按鈕組成。這些按鈕是選單功能的捷徑,各種圖示直觀地表示了它能執行的動作。Component Panel由一行、若干頁對象按鈕所組成,利用它來選擇需要的部件並將它放到窗體中去。
Object Inspector視窗含有兩頁:Properties頁顯示窗體中當前被選擇部件的屬性信息,並允許改變對象的屬性;Events頁列出了當前部件可以回響的事件。按動Object Inspector下端的“Events”頁標籤,使得Events頁可見,這一定的事件後邊的空白處,可以定義對象接受到相應事件時執行的動作。首次啟動時,Object Inspector視窗顯示的是當前窗體Form1的屬性。Object Inspector根據對象屬性的多少,決定是否有滾行顯示。移動滾行條,可以查看當前對象的全部屬性。
此外,Object Inspector上還有Object Selector(對象選擇器),位於Object Inspector上方的下拉式選單中。它顯示了窗體上所有部件的名稱和類型,也包含窗體本身。您可以用Object Selector很容易地在窗體的各個部件之間切換,也可以快速地回到窗體本身。當窗體中含有較多的對象時,您會發現這是切換對象尤其是回到窗體的最快捷途徑。
想使Object Inspector一直可見,可將滑鼠移到Object Inspector上,按動右鍵,以啟動Object Inspector的彈出式選單,將其設定為Stay On Top。這對初學者常是一個很重要的設定方式。
窗體視窗
Forms視窗是開展大部分設計的工作區域。首次啟動Delphi 2.0時顯示的是窗體Form1。可以把部件放在窗體中,通過移動位置、改變尺寸等操作隨心所欲地安排它們,以此來開發應用程式的用戶界面。您可以把窗體想像成一個可以放置其它部件的容器。窗體上有柵格(Grids),供放置部件時對齊位置用,在程式運行時Grids是不可見的。一個真正的應用程式可能有不止一個視窗,您可以選用不同的窗體進行設計。其它窗體可以是對話框(Dialog Box)、數據錄入框等。
代碼視窗一開始處於窗體視窗之下。因為在Delphi中,設計用戶界面直接在窗體中進行,運行結果和設計樣板完全一致。當部件被放到窗體上時,Delphi會自動生成大部分的用戶界面代碼。您所應做的只是在它為您生成的框架中加入完成所需功能的程式段而已。點動Form1的狀態行使代碼視窗可見。
這個視窗中是代碼編輯器。可以在其中書寫Delphi應用程式的原始碼。當程式中含有不止一個視窗時,會有幾個庫單元的源程式出現在代碼編輯器中。代碼編輯器的標題條中顯示了當前正在編輯的庫單元檔案名稱。要查看某一特定程式的原始碼,只需用滑鼠點動寫有該庫單元檔案名稱的頁標籤,就可以對該庫單元進行編輯了。
用戶界面
從空白窗體開始工作。將設計一個簡單的程式:在螢幕上開一個視窗,視窗中有一個圖框,用三個按鈕來改變圖框的形狀;再用一個圖示按鈕來進行圖框的顏色設定,通過顏色編輯對話框來選擇變成哪一種顏色。在選單上選用File|New Application選單項來生成新的工程檔案。這時,螢幕上出現窗體。 部件(Component)是建立Delphi應用程式的要素。Delphi為用戶提供了豐富的部件庫,既有可視的部件(如編輯框、按鈕)等,也有不可視的部件(如系統定時器、數據表等)。它們按照功能分別排列在Component Panel的各頁上。
移動滑鼠到Component Panel上,在部件按鈕上“猶豫”一、兩秒鐘,一個黃色小提示框就會彈出,寫有該部件的名稱,稱之為提示(Hint)。在要選擇的部件上單擊左鍵,則該部件按鈕被按下,表示部件已被當前選擇。然後,將滑鼠移動到窗體上,按下左鍵,該部件被放到窗體中。部件的輪廓線上會顯現八個被稱為尺寸調整器(Sizing Handles)的黑色小方塊。它除了供用戶調整尺寸使用之外,還可以表示該對象處於當前編輯狀態。此時,按“Delete”鍵可以將該部件刪除。
在Component Panel上,點動寫有“Additional”的頁標籤,切換到Additional頁,再移動滑鼠,逐個用觀看Hint的辦法查看部件的名稱,找到“Shape”部件(其圖示為圓、方形、三角形三個幾何體),將其放到窗體的左方。再按動“Standard”頁標籤,找到“Button”部件(圖示上畫有OK按鈕)。Delphi允許在添加多個同類型的部件時,不必每次到部件選項板上選取。按住“Shift”鍵,同時在“Button”部件上單擊滑鼠左鍵,這時“Button”部件處於按下狀態,並有藍色框線,表示已經被選擇固定。依次在窗體右方的三個位置單擊左鍵,則會放置三個相同的Button部件。把滑鼠游標移到部件選項板左側的箭頭圖示處,這是“取消選擇”按鈕,它沒有提示。按動它,會發現“Button”部件按鈕恢復彈起狀態。否則,每次“Form1”上的滑鼠單擊左鍵動作,都會導致增加一個按鈕部件。
再次進入“Additional”部件頁,選擇一個“BitBtn”按鈕(圖示是有綠色對號的OK按鈕),把它放到其它三個按鈕部件的下面。
點動“Dialog”頁標籤,選擇以16色格線做圖示的ColorDialog部件並把它放到窗體的任意位置。因為這一部件是不可視部件,所以它的位置並不影響大局。
部件調整
一般來講,此時放置到窗體的部件是分散排列的,而且其大小不是真正需要的尺寸。除了不可視的ColorDialog部件外,其它的部件都需要進行位置、大小和顯示字樣的調整。Delphi提供的對齊工具和視窗柵格為這些調整提供了方便。移動部件:只需把滑鼠落到想移動的部件上,按住左鍵並移動游標,到合適的位置再釋放左鍵,整個部件即被移到新位置。
調整尺寸:先把滑鼠游標移動到要改變尺寸的部件上,單擊左鍵,選中該部件,尺寸調整器會出現,把滑鼠移動到其中的一個小黑色方塊上,當滑鼠變成拖動方向指示時,按下並拖動滑鼠左鍵,可以放大或縮小部件。上下左右的小方塊用來移動對應的各邊,四個角的方塊可以移動相連的兩條邊。如果要精確地表述部件的尺寸,可以在Object Inspector上,改變Left(表示部件左邊緣到窗體左框線的象素點數)、Top(表示窗體上框線到部件上邊緣的象素點數)、 Width(部件本身的寬度)、Height(部件本身的高度)等屬性。關於改變部件的屬性,下文還將仔細講解。
使得一組部件對齊:用調整位置的方法可以對齊部件,但操作步驟複雜。Delphi提供的對齊工具可以使多個部件的對齊極為迅速方便。下面來使四個按鈕對齊。先將四個按鈕選為一組:按住並向右下方拖動滑鼠左鍵,在窗體上畫出圍繞四個按鈕的矩形,釋放左鍵後,被選中的按鈕周邊會出現暗灰色的框線。選用Edit|Align命令,或使用彈出式選單(在被固定的部件上單擊滑鼠右鍵激活),可以顯示圖1.4所示的對話框。
要使按鈕沿左邊對齊並使它們在垂直方向上均勻分布,先在Alignment對話框的Horizontal欄內選擇“Left sides”,在“Vertical”欄內選擇“Space equally”,按動OK按鈕,Delphi就會自動將它們對齊。然後,您可以將它們四個作為一組來移動。在四個按鈕以外的窗體上按動滑鼠左鍵,就釋放了組中的部件,使它們成為分立的部件。
利用對齊模板來對齊部件也是很方便的。首先要將要對齊的部件選成一組,選擇View|Alignment Palette顯示對齊模板。按照所示的方式選擇即可達到對齊的目的。
鎖定部件
如果部件已經對齊,為防止不小心移動部件,可以將部件位置鎖定。選擇主選單上的Edit|LockControls選項,使得部件不能進行移動操作。解鎖只需再次選擇此項即可。
調整“Shape”部件的大小,使之與右邊的按鈕組相匹配。再改變窗體的大小,按住並拖動窗體右下方使之剛好包容窗體上的全部部件。這樣,您的用戶界面就會比較美觀。及時地保存所做的工作至關重要。對設計者來講,有兩個檔案需要保存:庫單元檔案(以.PAS為後綴)和工程檔案(以.DPR為後綴)。從主選單上選擇File|Save Project As...項,Delphi會顯示標題為“Save Unit1 As”的檔案保存對話框,Delphi 2.0 允許用戶更改存儲路徑,您可以在下拉式列表框中選擇。最好將您的檔案保存在自己的目錄中。在編輯框中鍵入demoform.pas以保存庫單元檔案;然後顯示標題為“Save Project As”的另一個檔案保存對話框,鍵入sample.dpr。Delphi保存這兩個檔案並返回窗體視窗。不要把庫單元和工程存成一樣的檔案名稱,Delphi要求兩者不同。
第一次保存後,以後可以隨時通過Speed Bar中的“Save All”和“Save file”來保存工程檔案和庫單元檔案。一般來講,當確認檔案的改變後,要同時存儲這兩個檔案。
運行工程:操作使您有了一個自己的應用程式界面。在速度條中按動“Run”按鈕(繪有綠色三角圖示),您可以看到,所生成的界面與您設計的界面是完全一致的。
改變對象的屬性:上述的工程雖能夠運行,但它對您的按動按鈕操作是沒有什麼反應的,而且,所有部件上還寫著不需要的字樣。雙擊視窗的關閉按鈕結束運行,回到設計界面。下面,將仔細講述如何在Object Inspector中改變部件的各種屬性。
用Properties頁改變部件的屬性值:首先要改變各種部件的標題。先給視窗命名為“Demo”。按動Object Inspector上端的Object Selector的題條或者其右端的下拉標誌,找到Form1項,並點動左鍵,窗體被選中。在Object Inspector的Properties頁中,找到Caption屬性並用左鍵選中,將其右端的Form1改為Demo,同時,您會發現窗體的標題已經相應地做了改變。
用滑鼠點中窗體中的Shape部件,Object Inspector列出了它的屬性。選中Shape屬性,您會發現右端出現了下拉標誌。點動這一標誌,可以查看對象的Shape屬性可選值。它的形狀可以是矩形、圓形、圓角矩形、方形等幾種。這是設計後續功能的基礎。
選中Button1按鈕,此時Object Inspector已經顯示出此按鈕的一應屬性。將它的Caption屬性改為“&Rectangle”,“&;”號使得Delphi特殊處理它後面的字元,在這裡,按鈕中的R字母被做了下劃線處理,運行時,可以用“Alt-R”來按動這一按鈕。同樣,您可以將其它的兩個按鈕Button2和Button3的Caption屬性改成需要的形狀指示,譬如“&RoundRec”、“&Ellipse”。可以把某個按鈕作為視窗上的預設按鈕,Delphi會為按鈕加上有黑色的邊緣。運行時,回車即相當於被按下。只需將此按鈕的Default屬性從False改成True,即將它設為窗體的預設按鈕。點動Default屬性,在右端的值後面雙擊左鍵,或從下拉選單中選取True,即可改變這一屬性。Delphi中有許多只有True、False兩個屬性的部件,雙擊左鍵可以在這兩個值之間切換。
漢化界面及字型
如果您的Windows95系統中安裝了中文系統,對界面做漢化是極其方便的。例如,您可以將Button1的Caption屬性改成“&R矩形”,同樣地可改變其它部件的屬性,將窗體做成中文的操作界面。
若對中、西文字型不滿意,則可以調整Font屬性以滿足您的要求。Font屬性的前面,有一個小小的“+”號,這說明它表征的是集屬性,也即屬性不再是一個單值,而是一個屬性的集合。雙擊Font,ObjectInspector將在下面擴充顯示它的其它屬性。Color用來表示文本的顏色,Name定義了字型名,如System,MsSerif,Arial,宋體,黑體等。Style下又擁有四個屬性:fsBold,fsItalic,fsUnderline和fsTrikeOut。如果想讓字型有其中的某種風格,可把相應的屬性值設成True。
Font對話框可以更為直接地設定以上屬性。Font屬性右側值段有帶省略號的按鈕,單擊它可以激活Font對話框,如圖1.7所示:
這一對話框中包含了上述的全部屬性,使得調整字形更為直接方便。但要申明的是,對於窗體Form來講,Font屬性改變的是窗體中其它部件的顯示字形,它本身的標題字型是預設的System字型,不能通過屬性來改變。
圖形編輯對話框
最後,用圖示按鈕BitBtn1來控制Shape部件的顏色。選中圖示按鈕,將它的Caption屬性改為“&Color”(或“&C顏色”)。可以在按鈕中加入一個圖示來形象地表述它的功能。選用ObjectInspector中的Glyph屬性,點動值段的三點按鈕,彈出圖形編輯對話框。
您可以通過圖形編輯對話框裝入圖示,在本例程中,按動Load按鈕,選擇\Delphi2.0\Images\Buttons\Brush.bmp檔案裝入,Bitbtn1就成為一個圖示按鈕。另外,Delphi還為您提供了豐富的Windows標準圖示按鈕。想運用它們,改變BitBtn的Kind屬性。用戶不妨嘗試一下,選擇其它值可以生成漂亮的標準按鈕,如OK,Cancel等等。這會使您在以後的程式開發中受益匪淺。
至此,界面的設計工作就已完成了。運行一下觀察效果,別忘記保存您的庫單元檔案、工程檔案。
事件處理過程
完成用戶界面,只是建立了一個“骨架”,下面要做的便是給程式加入“靈魂”,也即,使它能夠完成所要求的功能。
顏色編輯對話框
圖示按鈕“Color”要控制部件Shape1的顏色,可以調入顏色編輯對話框,用以選擇要變成的顏色。這時就要用到運行時不可視的部件ColorDialog了。同樣地使圖示按鈕BitBtn1回響OnClick事件,在它的過程中加入以下的語句:
ColorDialog1.Execute;
Shape1.Brush.Color:=ColorDialog1.Color;
這樣,圖示按鈕的功能也就完成了。
初學者可能對這樣的程式段不能理解。其實也是十分簡單的。查看ColorDialog的Brush屬性,就會發現它是個集屬性,在其下還有一個Color選項,正是想改變的屬性。既然想將圖形的顏色變得更加豐富多彩,它本身提供的幾種顏色就已不能滿足要求了。用顏色編輯器可以得到更多的色彩。程式的第一句用Execute方法,使得ColorDialog運行它本身。當用戶在對話框中進行操作,選定了一種顏色時,即使得TColorDialog對象的一個屬性Color置為選定顏色的值。將此值賦給Shape1的Brush屬性的子屬性Color,就將選定的顏色加到了圖形上。
讀者的要求可能會是,怎樣儘快的了解這些這些方法、屬性和域呢?下文對使用在線上幫助的簡單介紹可能會對您有所裨益。
使用在線上幫助
事實上,使用在線上幫助是您全面地了解可用的方法、對象的域、??的例程。較為簡單有效的方法是使用Help中的搜尋功能。如果您對一個對象知之甚少,選用主選單中的Help|HelpTopics項,在彈出的幫助對話框,選用Indexes(“索引”)頁,Delphi2.0會提示您輸入要檢索的主題。以您想用的部件的對象名作為檢索主題詞,可以參閱很多基本的信息。例如,上文的例程中,在編輯框中鍵入對象的名稱TColorDialog,在詞條中就會出現該主題,按動Display按鈕顯示出TColorDialog的幫助信息。查看method,可以找到能套用在CclorDialog1上的方法Execute;仔細閱讀它的功能,上述的編程便不難理解了。Properties中提供了部件的所有屬性,在關鍵屬性KeyProperties前加上了“金鑰匙”,提供了詳盡的說明。在Task中您可以查閱該對象的其它相關主題,還可以參閱Example中的套用例程。
編程方法
Delphi的程式語言是以Pascal為基礎的。Pascal語言具有可讀性好、編寫容易的特點,這使得它很適合作為基礎的開發語言。同時,使用編譯器創建的應用程式只生成單個執行檔(.EXE),正是這種結合,使得Pascal成為Delphi這種先進開發環境的程式語言。
本章中,將討論ObjectPascal的主要特點,並講解如何在事件處理過程和其他應用程式中,使用它來編製程序代碼。本章將講解Delphi應用程式中最常用的ObjectPascal語法,而不是Pascal語言的一切細節。如果您完全不熟悉Pascal編程,請參閱一些基礎的Pascal教程。如果您具有編程經驗,並能熟練地使用其他流行程式語言,您將在本章的ObjectPascal中發現一些相同的概念。如果您已經熟悉了BorlandPascal,就可以快速瀏覽或跳過本章。
編寫ObjectPascal程式代碼
在前邊的章節中,通過例程,已經編寫了幾行簡單的代碼。在本章中,將從熟悉Pascal編程的角度,配合實例,講解ObjectPascal編程的基該方法。
在編寫自己的ObjectPascal程式時,要注意程式的可讀性。Pascal語言是英式結構語言,在程式中選擇合適的縮排、大小寫風格,並在需要時將程式代碼分行,會使得程式代碼能夠很容易地被自己和他人讀懂。一般的程式設計師都有這樣的體驗:如果不給程式加上適當的註解,一段時間後,自己也難以理清程式的流程。給程式及時地加上注釋是良好的編程習慣。Delphi的注釋需要加注在{}之間,編輯器會把它們處理成為空白。Delphi保留了BorlandPascal編輯器的風格,關鍵字採用黑體字,被注釋的部分會變暗,這使得編程風格良好,易讀易寫。
賦值
在事件處理過程中,最常用到的工作就是把一個新值賦給一個屬性或變數。在設計用戶界面時,可以使用ObjectInspector(ObjectInspector)來改變其屬性;但有時需要在程式執行時改變屬性的值,而且有些屬性只能在執行時改變,這些屬性在Delphi的線上幫助的“Proprety”主題中被標為執行期屬性。進行這種改變,就必須使用賦值語句。
下文的賦值語句表征一個OnClick事件。當按鈕按動後,將編輯框部件Edit1的Color屬性置為clRed:
procedureTForm1.Button1Click(Sender:TObject);
begin
Edit1.Color:=clRed;
end;
當按動按鈕後賦值語句被執行,編輯框變成紅色。
在語句中,部件的名稱在屬性前,中間用“.”表示屬性的所屬關係。這樣就準確地指定了要將clRed值賦給哪一部件的哪一屬性。賦值號為“:=”,不論給屬性還是給變數賦值,都是將右邊的值賦給左邊的屬性或變數。
當將一個屬性值、變數、常量或文本數據賦給屬性或變數時,所賦值的類型和接受此值的屬性或變數的類型應相同或兼容。一個屬性或變數的類型定義了此屬性或變數的可能值集合,也定義了程式代碼可以執行的運算。在前邊的例程中,編輯框部件的Color屬性和clRed的類型都是TColor。可以在線上幫助中找到一個屬性的類型;另外一種方法是在ObjectInspector中選定該屬性值段,並按下F1鍵,則類型將在屬性說明的結尾處列出,例如Color屬性列出下邊的語句:
PropertyColor:TColor;
有些屬性是唯讀(ReadOnly)的,它們只能被讀取,不能被改變。請查閱線上幫助,在Delphi中這些唯讀屬性都有註解。
標識符的說明與使用
標識符是Delphi應用程式中一些量的名稱,這些量包括變數(var)、常量(const)、類型(type)、過程(procedure)、方法(Method)及其他,ObjectPascal在套用標識符時,必須首先說明它們。ObjectPascal是強類型語言,它的編譯器可以檢查確保賦給變數或屬性的值是正確的類型,以便於您改正錯誤。因為ObjectPascal是編譯語言,所以Delphi的執行速度要比使用解釋語言快得多。在使用標識符前說明它們,可以減少程式錯誤並增加代碼的效率。
變數
變數是程式代碼中代表一個記憶體地址的標識符,而此地址的記憶體內容在程式代碼執行時可以被改變。在使用變數前必須對它進行說明,即對它進行命名,並說明它的類型。在所有變數說明以前加上保留字var。變數說明左邊是變數的名稱,右邊則是該變數的類型,中間用(:)隔開。
var
Value,Sum:Integer;
Line:String;
在窗體中加入一個名稱為Edit1的編輯框,再加入一個名稱(屬性Name)為Add的按鈕部件,並建立如下的事件處理過程:
procedureTForm1.addClick(Sender:TObject);
var
X,Y:Integer;
begin
X:=100;
Y:=20;
Edit1.Text:=IntToStr(X+Y);
end;
在本例中,當按動ADD按鈕時,編輯框中顯示值120。在ObjectPascal中,必須確保變數或屬性被賦予類型相同或兼容的值。您可以嘗試將賦給X的值改為100.0,或去掉IntToStr函式,在編譯時會出現類型不匹配的錯誤,這也說明了ObjectPascal強類型語言的特點。
條件
case語句適用於被判斷的變數或屬性是整形、字元型、枚舉型或子界型時(LongInt除外)。用case語句進行邏輯跳轉比編寫複雜的if語句容易閱讀,而且程式代碼整形較快。
下面的例程顯示一個使用case語句的窗體:
建立如下的事件處理過程:
procedureTForm1.Button1Click(Sender:TObject);
var
Number:Integer;
begin
Number:=StrToInt(Edit1.Text);
caseNumberof
1,3,5,7,9:Label2.Caption:="奇數";
0,2,4,6,8:Label2.Caption:="偶數";
10..100:
begin
Label2.Caption:="在10到100之間";
Form1.Color:=clBlue;
end;
else
Label2.Caption:="大於100或為負數";
end;
end;
執行程式,當Edit1部件接受到一個值,並按動“OK”按鈕觸發程式後,Number便被賦值為用戶輸入的數值。case語句根據Number的值判斷該執行哪一條語句。象if語句一樣。case語句也有可選擇的else部分。case語句以end結尾。
循環
ObjectPascal的循環語句有三種:repeat、while和for語句。
repeat語句
repeat語句會重複執行一行或一段語句直到某一狀態為真。語句以repeat開始,以until結束,其後跟隨被判斷的布爾表達式。參閱以下的例程:
i:=0;
repeat
i:=i+1;
Writeln(i);
until=10;
當此語句被執行時,窗體的下方會出現1到10的數字。布爾表達式i=10(注意,與其他語言不同的是,“=”是關係運算符,而不能進行賦值操作)直到repeat..until程式段的結尾才會被計算,這意味著repeat語句至少會被執行一次。
不同
while語句和repeat語句的不同之處是,它的布爾表達式在循環的開頭進行判斷。while保留字後面必須跟一個布爾表達式。如果該表達式的結果為真,循環被執行,否則會退出循環,執行while語句後面的程式。
下面的例程達到和上面的repeat例程達到同樣的效果:
i:=0;
whilei0then
test2(A);{經前置說明,調用未執行的過程Test2}
writeln(A);
end;
procedureTest2(varA:Integer);{經前置說明的Test2的執行部分}
begin
A:=Adiv2;
ifA>0rhen
test1(A);{在Test2中調用已執行的過程Test1}
end;
procedureTForm1.Button1Click(Sender:TObject);
begin
Alpha:=15;{給Alpha賦初值}
Test1(Alpha);{第一次調用Test1,遞歸開始}
end;
按鈕的OnClick事件處理過程給Alpha賦初值,並實現先減1再除2的循環遞歸調用,直到Alpha小於0為止。
函式
過程
過程與函式是程式中執行特定工作的模組化部分。Delphi的運行庫包含許多過程與函式以供您的應用程式調用。您不必了解過程與函式的邏輯,但要知道過程與函式的用途。在對象中說明的過程和函式稱為方法(Method)。所有的事件處理過程都是過程,以保留字procedure開頭。每一個事件處理過程只包含了當這一事件發生時需要執行的程式代碼。在事件處理過程中使用Delphi已經存在的過程與函式,只需在程式代碼中調用它們即可。
使用
與過程一樣,函式的程式代碼也執行特定的工作。它和過程的差別為:函式執行時會返回一個值,而過程則沒有返回值。函式可以用來賦給一個屬性或變數;也可以使用返回值來決定程式的流程。前文中實際上已經接觸過了函式。在講述變數時,曾用到過下面的程式段:Edit1.Text:=IntToStr(X+Y);其中,IntToStr(Value)把一個LongInt類型的數值轉化為字元串的值,Value是IntToStr唯一的參數,它可以是一個整形的值、變數、屬性或產生整形值的表達式。調用函式,必須把返回值賦給和此返回值類型兼容的變數或屬性。
有些函式返回一個True或False的布爾量,用戶的程式可以根據返回值來決定跳轉。下文的例程講述了函式返回值為Boolean的判斷用法:
在窗體中加入一個ColorDialog對象和一個Name屬性為ChangeColor的按鈕。為按鈕的OnClick事件建立事件處理過程如下:
procedureTForm1.ChangeColorClick(Sender:TObject);
begin
if ColorDialog1.Execute then
Form1.Color:=ColorDialog1.Color
else
Form1.Color:=clRed;
end;
此事件處理過程使用一個返回Boolean值的Execute方法。按動按鈕,並在顏色對話框中選擇一個顏色。如果按動OK按鈕,ColorDialog.Execute方法將返回True,則Form1.Color將被賦值為ColorDialog1.Color,窗體顯現您選用的顏色;如果按動顏色對話框的Cancel按鈕,方法將返回False值,窗體將變為紅色。
跳轉語句
ObjectPascal的跳轉語句有if和case兩個。
if語句
if語句會計算一個表達式,並根據計算結果決定程式流程。在上文的例程中,根據ColorDialog.Execute的返回值,決定窗體的背景顏色。if保留字後跟隨一個生成Boolean值True或False的表達式。一般用“=”作為關係運算符,比較產生一個布爾型值。當表達式為True時,執行then後的語句。否則執行else後的代碼,if語句也可以不含else部分,表達式為False時自動跳到下一行程式。
if語句可以嵌套,當使用複合語句表達時,複合語句前後需加上begin…end。else保留字前不能加“;”,而且,編譯器會將else語句視為屬於最靠近的if語句。必要時,須使用begin…end保留字來強迫else部分屬於某一級的if語句。
程式
程式代碼在調用一個過程或函式時,通常用參數傳遞數據到被調用的過程或函式中。最常用的參數有數值參數、變數參數和常量參數三種。由被調用過程或函式定義的參數為形參,而由調用過程或函式指明的參數叫實參。在NoValue函式中,說明函式體中的AnEditBox是形參,而調用時在ifNoValue(Edit1)…中,Edit1是實參。
數值參數在運行過程中只改變其形參的值,不改變其實參的值,即參數的值不能傳遞到過程的外面。試看下面的例程:
procedureCalculate(CalNo:Integer);
begin
CalNo:=CalNo*10;
end;
用以下例程調用Calculate函式:
Number:=StrToInt(Edit1.Text);
Calculate(Number);
Edit2.Text:=IntToStr(Number);
Number接受由編輯框1輸入的數值,經Calculate過程運算。它是一個數值型實參。在進入Calculate函式後,會把Number實參拷貝給形參CalNo,在過程中CalNo增大十倍,但並未傳遞出來,因此Number值並未改變,在編輯框2中顯示仍然是編輯框1中的輸入值。形參和實參占用不同的記憶體地址,在過程或函式被調用時,將實參的值複製到形參占用的記憶體中。因此出了過程或函式後,形參和實參的數值是不同的,但實參的值並不發生變化。如果您想改變傳入的參數值,就需要使用變數參數,即在被調用程式的參數表中的形參前加上保留字var。例如:procedureCalculate(varCalNo:Integer);
則CalNo並不在記憶體中占據一個位置,而是指向實參Number。當一個變參被傳遞時,任何對形參所作的改變會反映到實參中。這是因為兩個參數指向同一個地址。將上一個例程中過程頭的形參CalNo前面加上var,再以同樣的程式調用它,則在第二個編輯框中會顯示計算的結果,把第一個編輯框中的數值放大十倍。這時形參CalNo和實參Number的值都是Nnmber初始值的10倍。
如果當過程或函式執行是要求不改變形參的值,最保險的辦法是使用常量參數。在參數表的參數名稱前加上保留字const可以使一個形參成為常量參數。使用常量參數代替數值參數可以保護您的參數,使您在不想改變參數值時不會意外地將新的值賦給這個參數。
物件類型
枚舉類型
一個枚舉型的說明列出了所有這種類型可以包括的值: type
Tdays=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);
可以定義上述枚舉類型的變數:
var
DayOfWeek:TDays;
在枚舉型中,括弧中的每一個值都有一個由說明它的位置決定的整形值。例如Sunday有整形值0,Monday有整形值1等。您可以把DayOfWeek說明為一個整形變數,並將一星期的每一天賦一個整形值以達到相同的效果,但用枚舉型會使得程式可讀性好,編寫容易。當您在枚舉型中列出值時,您同時說明了這個值是一個標識符。例如您的程式中如果已經含有TDays類型且說明了DayOfWeeks變數,則程式中便不能使用Monday變數,因為它已經被說明為標識符了。
子界類型
子界型是下列這些類型中某範圍內的值:整形、布爾量、字元型或枚舉型。在您想限制一個變數的取值範圍時,子界型是非常有用的。
type
Thours=0..23;
TValidLetter="A"..'F';
TDays=(Sunday,Monday,Tuesday,Wednesday,Thursday,
Friday,Saturday);{枚舉型}
TWorkDay=Monday..Friday;{一個TDays型的子界}
子界型限定了變數的可能取值範圍。當範圍檢查打開時,(在庫單元的Implementation後面有{$R*.DFM}字樣表示範圍檢查打開,否則您可以在Options|Project|ComplierOptions中選擇RangeCheking來打開範圍檢查),如果變數取到子界以外的值,會出現一個範圍檢查錯誤。
數組類型
數組是某種數據類型的有序組合,其中每一個元素的值由其相對位置來指定,您可以在數組的某個位置上放置數據,並在需要時使用這些數據。下面的類型說明了一個Double型的數組變數:
var
Check:array[1..10]ofDouble;
它表示Check指向一個含有10個Double型元素的數據串列,代表每一個元素的是1到10之間的數字,稱為索引。數組的每一項由數組名稱加上[]中的索引來表示。Check包含10個變數,Check[1]表示第一個變數。您也可以把數組定義成類型:
type
TCheck=array[1..10]ofDouble;
則變數說明改為:
var
Check:TCheck;
您可以通過給數組賦值等方法來使用數組。下面的語句將0.0賦給Check數組中的所有元素:
forJ:=1to10do
Check[J]:=0.0;,
數組也可以是多維的,下面的類型定義了一個20行、20列的數組。
type
Ttable=array[1..20,1..20]ofDouble;
var
table1:TTable;
,;,;想將這一表格的所有數據初始化為0.0,您可以使用for循環:
var
Col,Row:Integer;
…
forCol:=1to20do
forRow:=1to20do
Table1[Col,Row]:=0.0;
字元串類型
字元串類型事實上是一個一維的字元數組。當您說明一個字元串型的變數時,您應當指明這個字元串的大小,下面是說明字元串類型的例子:
type
MyString:string[15];
var
MyName:MyString;
則變數MyName被說明成為最多可以包含15個字元。如果您沒有說明字元串的大小,Delphi會認為字元串包含最大值255個字元。給字元串賦值可以直接使用單引號括起的字串賦值:
MyName:="Frank.Smith";
或MyName:="張明";
因為MyName是一個可以包含15個字元的MyString型變數,上文的兩個的變數都是有效的,一個漢字可以視作兩個字元。當您給字元串型變數賦的值多於定義數值時,例如將MyName賦為‘FrankSmith.Franklin’,則Delphi只會接受前15個字元‘FrankSmith.Fran’。在記憶體中,字元串通常占用比所說明的大小多一個位元組的空間,因為第一個位置是一個包含這個數組大小的位元組。您可以使用索引值來訪問字元串的字元,MyName[1]可以得到MyName的第一個字元'F'。
可以使用Delphi豐富的運算符、過程和函式來處理字元串型的變數和屬性。下面介紹幾個常用的運算符和Delphi過程或函式:
Concat和(+)功能相同,都可以將多個字元串組合在一起,建立一個較大的字元串;Copy會返回一個字元串中的子字元串;Delete在一個字元串中從一個指定位置起刪除一定數目的字元;Insert在一個字元串中插入一個字元串;Length返回字元串的長度;Pos返回一個子字元串在一個字元串中的位置,即索引值。
集合類型
集合類型是一群相同類型元素的組合,這些類型必須是有限類型如整形、布爾型、字元型、枚舉型和子界型。在檢查一個值是否屬於一個特定集合時,集合類型非常有用。下面的例程可以說明集合類型的用法:在窗體上加入一個編輯框和一個按鈕,清除編輯框中的文字,在其上加上Caption為“輸入元音”的標籤Label,並在編輯框的下方加入一個空的標籤,將按鈕的Default屬性改為True,建立按鈕的事件處理過程如下:
procedureTForm1.Button1Click(Sender:TObject);
type
Tvowels=setofChar;
var
Vowels:TVowels;
begin
Vowels:=['a','e','i','o','u'];
ifEdit1.Text[1]inVowelsthen
Lable2.Caption:="是元音";
else
Lable2.Caption:="請再試";
end;
執行這個程式,在編輯框中輸入字母,表達式Edit1.Text[1]inVowels的結果是布爾型的,in是運算符,用來判斷字母是否存在於集合中。輸入的判別結果會顯示在編輯框的下方。以上就用到了集合類型TVowels。
記錄類型
記錄是您的程式可以成組訪問的一群數據的集合。下面的例程說明了一個記錄類型的用法:
type
TEmployee=record
Name:string[20];
YearHired:1990..2000;
Salsry:Double;
Position:string[20];
end;
記錄包含可以保存數據的域,每一個域有一個數據類型。上文的記錄TEmployee類型就含有四個域。您可以用以下的方式說明記錄型的變數:
var
NewEmployee,PromotedEmployee:TEmployee;
用如下的方法可以訪問記錄的單域:
NewEmployee.Salary:=1000;
編寫如下的語句可以給整個記錄賦值:
withPromotedEmployeedo
beginsfu nb
Name:="";
YearHired:=1993;
Salary:=2000.00
Position:="editor";
end;
您的程式可以將記錄當成單一實體來操作:
PromptEmployee:=NewEmployee;
以上介紹了用戶常用的自定義類型。在Delphi的編程中,對象是非常重要的用戶自定義數據類型。象記錄一樣,對象是結構化的數據類型,它包含數據的域(Field),也包含作為方法的過程和函式。在Delphi中,當您向窗體中加入一個部件,也就是向窗體對象中加入了一個域;每一個部件也是對象,每當您建立一個事件處理過程使得部件可以回響一個事件時,您即自動地在窗體中加入了一個方法。
檔案操作
Delphi可對Windows作業系統的註冊表、存儲設備和檔案系統進行方便的訪問。
內置單元Registry.pas中提供了TRegistry、TRegIniFile、TRegistryIniFile三個封裝類,提供了常用的註冊表、配置檔案操作功能。
Classes.pas單元中,由TStream派生的THandleStream、TFileStream、TMemoryStream、TStringStream、TResourceStream,提供了涵蓋檔案流、記憶體流、字元序列流和資源流的讀寫操作,可方便地對檔案以及中間交換的序列化數據進行處理。而TStreamAdapter以接口形式提供了更為高級的流與流之間的相互操作。
對象編程
Delphi是基於面向對象編程的先進開發環境。面向對象的程式設計(OOP)是結構化語言的自然延伸。OOP的先進編程方法,會產生一個清晰而又容易擴展及維護的程式。一旦您為您的程式建立了一個對象,您和其他的程式設計師可以在其他的程式中使用這個對象,完全不必重新編制繁複的代碼。對象的重複使用可以大大地節省開發時間,切實地提高您和其他人的工作效率。
什麼是對象
一個對象是一個數據類型。對象就象記錄一樣,是一種數據結構。按最簡單的理解,可以將對象理解成一個記錄。但實際上,對象是一種定義不確切的術語,它常用來定義抽象的事務,是構成應用程式的項目,其內涵遠比記錄要豐富。在本書中,對象可被理解為可視化部件如按鈕、標籤、表等。了解對象,最關鍵的是掌握對象的特性。一個對象,其最突出的特徵有三個:封裝性、繼承性、多態性。
對象的封裝性
對對象最基本的理解是把數據和代碼組合在同一個結構中,這就是對象的封裝特性。將對象的數據域封閉在對象的內部,使得外部程式必需而且只能使用正確的方法才能對要讀寫的數據域進行訪問。封裝性意味著數據和代碼一起出現在同一結構中,如果需要的話,可以在數據周圍砌上“圍牆”,只有用對象類的方法才能在“圍牆”上打開缺口。
對象的繼承性
繼承性的含義直接而且顯然。它是指把一個新的對象定義成為已存在對象的後代;新對象繼承了舊類的一切東西。在往新對象中添加任何新內容以前,父類的每一個欄位和方法都已存在於子類中,父類是創建子類的基石。
對象的多態性
多態性是在對象體系中把構想和實現分開的手段。如果說繼承性是系統的布局手段,多態性就是其功能實現的方法。多態性意味著某種概括的動作可以由特定的方式來實現,這取決於執行該動作的對象。多態性允許以類似的方式處理類體系中類似的對象。根據特定的任務,一個應用程式被分解成許多對象,多態性把高級設計處理的構想如新對象的創建、對象在螢幕上的重顯、程式運行的其它抽象描述等,留給知道該如何完美的處理它們的對象去實現。
對象範圍
一個對象的範圍決定了它的數據域、屬性值、方法的活動範圍和訪問範圍。在一個對象的說明部分說明的數據域、屬性值、方法都只是在這個對象的範圍中,而且只有這個對象和它的後代才能擁有它們。雖然這些方法的實際程式代碼可能是在這個對象之外的程式庫單元中,但這些方法仍然在這個對象的範圍內,因為它們是在這個對象的說明部分中說明的。
當您在一個對象的事件處理過程中編寫程式代碼來訪問這個對象的屬性值、方法或域時,您不需要在這些標識符之前加上這個對象變數的名稱。例如,如果您在一個新窗體上加入一個按鈕和一個編輯框,並為這個按鈕編寫OnClick事件處理過程:
procedureTForm1.Button1Click(Sender:Tobject);
begin
Color:=clFuchsia;
Edit1.Color:=clLime;
end;
其中的第一行語句是為整個窗體Form1著色。可以編寫如下:
Form1.Color:=clFuchsia;
如果Edit1是在其他窗體中,那么您需要在編輯框之前加上這個窗體對象的名稱了。例如,如果Edit1是在Form2之中,那它是Form2說明的一個數據域,並位於Form2的範圍中,那么您需要將第二句改為:
Form2.Edit1.Color:=clLime;
而且需要把Unit2加入Unit1的uses子句中。
數據繼承
前面的TForm1類型是很簡單的,因為它只含有域Button1和方法Button1Click。但是在這個窗體上,您可以改變窗體的大小、加入或刪除窗體的最大最小化按鈕,或設定這個窗體為MDI界面。對於一個只包含一個域和方法的對象來講,您並沒有看到顯式的支持程式。在窗體上單擊滑鼠或用ObjectInspector的上端的ObjectSelector選中Form1對象,按動F1查閱它的線上幫助,您會在Properties和Method中找到它的繼承到的全部屬性和方法。這些是在TForm類型中說明的,TForm1是TForm的子類,直接繼承了它所有的域、方法、屬性和事件。例如窗體的顏色屬性Color就是在TForm中說明的。當您在工程中加入一個新窗體時,就等於加入了一個基本模型。通過不斷地在窗體中加入部件,您就自行定義了一個新的窗體。要自定義任何對象,您都將從已經存在的對象中繼承域和方法,建立一個該種對象的子類。例如對象TForm1就被說明為對象TForm的子類,擁有一個窗體部件的基本屬性或方法。只有當您在窗體中加入了部件或編寫了事件處理過程時,Form1才成為您自己的類型。
一個比較特殊的對象是從一個範圍較廣或較一般的對象中繼承下來的,它是這個特別對象的祖先,這個對象則稱為祖先的後代。一個對象只能有一個直接的祖先,但是它可以有許多後代。TForm是TForm1類型的祖先,所有的窗體對象都是TForm的後代。
用F1查閱窗體的線上幫助時,您會發現TForm被稱為component(部件)。這是因為所有的部件都是對象。
在這個結構中所有的部件都是對象。部件類型TComponent從TObject類型中繼承數據和程式代碼,並具有額外的可以用作特殊用途的屬性、方法、事件,所以部件可以直接和用戶打交道,記錄它的狀態並存貯到檔案中等等。控制類型TControl從TComponent中繼承而來,又增加了新的功能,如它可以顯示一個對象。在上圖中,雖然TCheckBox不是直接由TObject繼承來的,但是它仍然有任何對象所擁有的屬性,因為在VCL結構中,TCheckBox終究還是從TObject中繼承了所有功能的特殊對象,但它還有些自行定義的獨到的功能,如可以選擇記錄狀態等。
臨時表
根據伺服器上的DB資料庫,在本地創建一個臨時的表 ,這樣可以提高用戶對數據的訪問效率,同時也減輕了資料庫的訪問壓力。
創建臨時表*.DB
procedure TfUserInfo.createWork;
begin
with tblUserInfo do //頁面上的Table控制項名字
begin
Active := False;
DatabaseName := 'Userwork';
TableName := 'W_USERINFO.DB'; //要創建的臨時表的名字
TableType := ttParadox;
with FieldDefs do //遍歷頁面(數據為DB Table)中的列,作為臨時表的列
begin
Clear;
Add('UserID' , ftString, 6, False); //設定臨時表的列、類型、長度
Add('UserName' , ftString, 20, False);
end;
CreateTable; //創建臨時表
end;
tblUserInfo.Close;
tblUserInfo.Open;
while not dbUserMSSQL.ADOQueryUser.Eof do //為臨時表填充數據
begin
tblUserInfo.Append;
tblUserInfo.FieldByName('UserID').AsString :=
dbUserMSSQL.ADOQueryUser.FieldByName('UserID').AsString;
tblUserInfo.FieldByName('UserName').AsString :=
dbUserMSSQL.ADOQueryUser.FieldByName('UserName').AsString;
tblUserInfo.Post;
dbUserMSSQL.ADOQueryUser.Next;
end;
tblUserInfo.First;
end;