一、為什麼選擇Delphi
在開始任何一個項目之前,總會碰到選擇開發工具的問題。各式各樣的工具有其各自的特點,各有利弊。選擇Delphi,各人有各人的理由,有的人是聽說好,跑來看看;有的人是被迫的。什麼時候人們會被迫使用Delphi呢? 對於我來說,
1)我不想在一個小Project中使用ODBC,我發現BDE效率很不錯,於是很高興。
2)我很討厭OCX, VBX,一大堆別人的東西拷入用戶的機器,讓我很沒有成就感。
3)我很少有機會作CVIEw/CDocument形式的程序,而MFC對其它的支持差得驚人。
4)我很喜歡Pascal,我敲begin....end不見得比敲{ ...}慢多少。
5)C和C++網上資源太少,只能偶爾找到一些snippet
二、一些基本概念
A.面向對象的概念簡單地說,Pascal原有的record類型,加上procedure和function就成了class 因此,一個class類的東東本質上是一個變量,Implementation裡定義了這個變量的Details, Interface是變量的定義,告訴編譯器在別人引用我時到哪裡找具體的代碼。一個Form引用另一個Form中的變量,實際上是兩個Form型變量的元素的引用。B. Delphi的Class三大元素這三大元素是Property, Method, Event 這是你要使用一個控件最重要的信息。Property可讀可寫,Method引發一個procedure或function, Event允許用戶定義回調函數。Property在Design Time時在Object Inspector中設,Method在程序中調用了解了這個概念,有助於你在看Help時不會暈頭轉向。C.關於Property的說明切記,Property的修改並不一定只是讀寫了一個變量,它有可能引發一大堆代碼。在Property的定義中,一般是這樣寫的property Lookup: Boolean read GetLookup write SetLookup; 在這裡,GetLookup和SetLookup是function,因此,有可能屬性一改,事實上作了很多工作。D.代碼的位置有時很重要在什麼時候調用特定的代碼是很重要的,Window整個都是由消息驅動的,永遠不會被觸發的代碼根本不被編譯到程序中去。你在Delphi 3中會看到它根本不被打上藍點。而且代碼是可以重入的!!!!以後會詳細討論這個問題。
三、從一個通訊錄程序開始
不使用Delphi的數據庫功能,對於初學者來說,實在有點可惜,Borland花了大量精力使數據庫編程變得簡單。數據庫編程最好的教程是Delphi 1.x中帶的Interactive Tutor(Delphi 3中好象沒有),它講述得非常生動,每一位初學者都應該看一看。
看過這個教? 可以自己試著作一個通訊錄程序。這樣一個程序大家都有感性的認識,容易上手。
第一步,用Database Desktop建一個數據庫,開一些Name, Tel, Addr, Memo 等字段,記住,千萬不要用中文作字段名哦。
第二步,用Database/Form Wizard作一個坯子看看再說。你會生成一個Form, 上面有一個DBNavigator,一堆Data-aware的控件和相應的Label(這個例子中,不建議用DBGrid) 第三步,右鍵單擊Table1控件,打開Field Editor,選擇Name字段,在Object Inspector中將它Display Name屬性改為姓名, Transliterate屬性改為False. 這是為了使StringFIEld顯示中文。依此類推,把你要改的字段都改過來。Label 的Caption也都改成中文。
第四步,把DBNavigator的VisibleButton中的除$#@60;-, -$#@62;, $#@60;$#@60;, $#@62;$#@62;, +, -,之外的Button都去掉。
第五步,再運行這樣你就作成了你的第一個中文通訊錄。這個通訊錄沒有什麼查找功能,顯然很沒市場,下面你給它加一個簡單的查詢功能。
第一步,加一個Button,Caption設為查找姓名 第二步,New一個Form,如Form2,上面加一個Edit,兩個BitBtn,一個Kind設為bkOK,另一個Kind設為bkCancel,按你的需要修改顯示的文字。
第三步,雙擊第一步中的Button,跳出代碼段。寫下以下代碼:
if Form2.ShowModal = mrOK then begin
第四步,在Unit1中的Uses中加入unit2;運行
Table1.DisableControls;
Table1.First;
while not Table1.EOF and
(Pos(Form2.Edit1.Text, Table1Name.Value)$#@62;0) do begin
Table1.Next;
end;
Table1.EnableControls;
end;
四、寫代碼的一些要素
A.盡可能不要在(對新手來說,是絕不要) TMyForm=class(TForm)
.....
.....
..... end; 之外定義變量,盡量在Private段定義自己的變量和Procedure等。
B.任何情況下,不論多麼艱難的調試情況,在begin回車之後,先打兩個空格再寫程序代碼。end一定要和相應的begin呼應在同一列上。
C. Delphi是大小寫不敏感的,但是多處引用時盡量保持相同的拼寫。
D.不要自己去刪Delphi自動生成的代碼,解鈴還需系鈴人,如果不小心在哪裡Double Click了一下,Delphi生成的程序會在Save Project和Build時自動刪掉。(只要begin...end中間沒寫你自己的代碼) E. FormCreat之前,它所包含的控件都還沒有建立,是不能引用的。在Form1OnCreat 時,你不能用Form1.ListBox1....... 但是你可以寫:
ListBox1......... 這是Delphi的約定,所以不要問我為什麼。
F. Form1如果是MainForm,在OnCreat時是不能去引用Form2的變量的,因為這時Form2還不存在。
G. Form2.ShowModal後,程序會在Form2返回後才執行後面的代碼,而用Show 可不是這樣。
H.任何一段消息回調函數的代碼都不要執行過長時間,如果迫不得已,在大循環的間隙,一定要調用Application.ProcessMessages 要不,程序會象死機一樣。
五、Windows編程的重入問題
TTimer是用於定時反復執行一些代碼,可是千萬記住如果一段代碼執行時間過長時,下一次Timer觸發會重入這段代碼,就是說如果Timer1Timer中沒有Timer1.Enabled := False; 的話,可能會有兩個進程在執行這段代碼,如果共同訪問一個變量,一個有可能在改,一個有可能在讀,那麼就會出現意想不到的問題。
類似的重入問題其它時候也會碰到,比如你在Show(而不是ShowModal)一個Form時,兩個Visible的Form在共同訪問同一變量,就會出現一些奇怪的現象。
新手最好先避開這類問題,省得麻煩。