Delphi入門點點滴滴

aricyoung發表於2008-08-28

“聰明的程式設計師用Delphi!”,不過現在Delphi用得人越來越少了,現將以前的一些經驗在此做個記錄,以後會陸續增加的。

[@more@]

==系統應用篇==

A.Delphi自代了大量的常用控制元件,如Delphi5就有一百多了,而今年出的Delphi6更是Delphi51.5倍。這麼多控制元件,就是在1024*768的解析度下也無法全部顯示他們的元件皮膚,而每次要按那兩顆小按鈕來顯示更多的皮膚,真是非常不方便!但透過新增下面那一個登錄檔鍵值就能實現元件皮膚自動展開:

[HKEY_CURRENT_USERSoftwareBorlandDelphiX.0Extras]

"AutoPaletteSelect"="1"

(注:X.0表示你的Delphi的版本號;如果沒有Extras主鍵則新建即可,下同)

B.每次新建窗體,然後設定其字型、大小……真是好麻煩的!那就再新增一個以下的鍵值,讓系統自動來設定吧:

[HKEY_CURRENT_USERSoftwareBorlandDelphiX.0FormDesign]

"DefaultFont"="宋體,9,_"

(注:_表示空格,也可以用Bold(粗體)等代替)

C.自定義工作環境,讓它更加適合自己。

設定工具欄。在Delphi的工具欄右鍵單擊,選Customize,然後挑選需要的按鈕拖到工具上,把不要的拖出來。我常用的是:Standard工具欄下的OpenOpen ProjectSaveSave AllUndoRedoDebug工具欄下的PauseAdd WatchProgram ResetRunDesktop工具欄下的Save Current DesktopSet Debug DesktopComponent Palette工具欄。

設定視窗布局。為了能跟高效的編寫程式,合理的佈置各個視窗是很重要的。我常用的視窗有:Object InspectorProject Manager(View|Project Manager)Watch List(Run|Add Watch...)

設定好各個窗體後按Desktop工具欄上的Save Current Desktop按鈕儲存。

設定顯示顏色。讓程式碼的顏色更符合自己的習慣,有利於編寫時思維的清晰。Tools|Editor Options開啟Editor Properties,選Color標籤頁,設定程式碼顏色。以下僅解釋一下幾個常用的:

Whitespace:空白處,即背景;

Comment:註釋;

Reserved word:保留字;

String:字串;

Number:數字;

Execution Point:正在執行的當前行(即F7步入時所到達的那一行);

Enabled break:斷點;

Error line:錯誤發生行;

D.掌握一些Delphi程式設計中的快捷鍵,能夠極大程度的提高效率,還不會讓你因為過多無聊的設定等而感到厭煩,現在如果不用這些快捷鍵,我會很不適應這樣的程式設計的!以下我就介紹一下我常用的幾個快捷鍵:

Esc : 選擇當前選中元件的容器(通常是Panel,GroupBoxForm等);

Ctrl+方向鍵 :將所選元件移動一個畫素;

Ctrl+Shift+方向鍵 :將所選元件移動一大格(類似Fireworks中按住Shift再用方向鍵移動時的效果);

Shift+方向鍵 :調整選中元件的大小,每次一畫素;

Shift+選中元件 :按住Shift鍵再用滑鼠點選元件,可以同時選擇多個元件;

Ctrl+滑鼠左鍵 :在procedure中掉用其他的函式(如一個自定義的過程),在這個呼叫處按住Ctrl會發現當滑鼠移上去的時候變成了一個類似超連結的格式,滑鼠單擊就能直接轉到所呼叫的此函式的實現部分。這個功能我可是用的最多了,讓我找模組變得非常方便!

Ctrl+Shift+C :在一個物件中宣告瞭一個方法,然後把游標放到它的上面,按下Ctrl+Shift+C就可以為他的實現建立一個基本框架,如:

TForm1 = class(TForm)

private

{ Private declarations }

public

{ Public declarations }

procedure Mine;

end;

把游標放到procedure Mine這行,按下Ctrl+Shift+C,下面這段程式碼將自動插入到單元中:

procedure TForm1.Mine;

begin

end;

==窗體操作篇==

在有多個窗體的程式中,Delphi預設是將它們在程式啟動時全部建立(只是都隱藏了,只顯示一個主窗體),這樣,那些暫時不必要啟動的窗體就佔用了許多記憶體空間。所以我們需要在選單Project|Options...Forms標籤頁下,將那些暫時不要啟動的窗體從“Auto-create forms”下轉移到“Available forms”中。這樣,這些窗體的建立和釋放就需要程式碼來實現了。

A.兩種建立窗體方法之比較。對於這些非自動建立的窗體,我們必須在Show之前Creat(Self)Create(Application),將其建立。如Form2.Creat(Self)Form2.Create(Application),可是,它們兩個到底有什麼區別呢?其實兩者區別不大,

但如果Owner是屬於別的視窗或控制元件的話,當它的Owner被釋放的時候,該Owner所擁有的也會被釋放。關鍵的區別是由誰來管理該窗體的資源。用第一種方法建立,該窗體的資源由程式設計者來負責管理;用第二種方法建立,該窗體的資源由Application來管理。

B.幾種窗體的釋放方法。既然是為了節約記憶體,那麼用完了的窗體就應該搬出記憶體。在這裡我列舉幾個大同小異的方法:

(1)

procedure TForm1.Button1Click(Sender :TObject);

begin

......

if Form2 = nil then

Form2:=TForm2.Create(Application);

Form2.ShowModal;

......

end;

procedure TForm2.close(Sender: TObject; var Action: TCloseAction);

begin

ModalResult := mrNone;

Action := caFree;

Form2 := nil;

end;

(2)

procedure TForm1.Button1Click(Sender :TObject);

begin

if not Assigned(Form2) then

begin

Application.CreateForm(TForm2,Form2);

try

Form2.ShowModal;

finally

Form2.Free;

Form2 := nil;

end;

end

else

Form2.ShowModal;

end;

(3)

procedure TForm2.Button1Click(Sender :TObject);

begin

Form2.Close;

Form2.Release;

end;

==控制元件使用篇==

A.大名鼎鼎的RXLib控制元件包是由三位俄羅斯高手編寫的,非常的出色!不過,內容太多了,要用好也不容易。我在此拿RxRichEdit簡單地說幾點。

好多人都問RxLib怎麼安裝,似乎的確有點複雜,呵呵,所以我也順便說一下:

執行rxinst.exeRxLib先安裝到Program FilesBorlandDelphi5(或6RX資料夾下,然後開啟Delphi,選FileOpen...,將RXCTL5.DPKRXDB5.DPKRXBDE5.DPK分別開啟後按compile,繼續開啟:DCLRX5.DPKDCLRXDB5.DPKDCLRXBD5.DPK,將這三個分別按compile後按install就可以了:-)

•AllowObjects屬性。Win98下預設設定為True,右鍵選單沒有問題,但設為False時快捷選單會連續出現兩次;Win2000下,設為True時會使右鍵選單無法彈出,而False時卻顯示正常。所以,為了系統的相容性,需要判斷當前OS版本:

procedure TFormMain.FormCreate(Sender: TObject);

var

OSVI:OSVERSIONINFO;

......

begin

OSVI.dwOSVersionInfoSize:=sizeof(OSVERSIONINFO);

GetVersionEx(OSVI);

case OSVI.dwPlatformId of

1:RxRichEdit1.AllowObjects:=true;

2:RxRichEdit1.AllowObjects:=false;

end;

.......

end;

但我不知這個屬性為什麼會有這麼一個問題,還望高手指點。

•OnURLClick事件。RXRichEdit有自動將網頁地址轉為超連結格式,但具體的行為還是要自己寫程式碼的,不然這些地址就成了個空殼了:

procedure TFormMain.RXRichEdit1URLClick(Sender: TObject; const URLText: String; Button: TMouseButton);

begin

if Button = mbLeft then

ShellExecute(Handle, nil, PChar(URLText), nil, nil, SW_SHOW);

end;

B.為了節約記憶體,最佳化執行,我們總是動態建立元件。可當用完之後,如果不及時徹底的將其從記憶體中清理出去,那就有違我們的初衷了。可怎麼殺死所建立的元件? 比如建立了一個Edit控制元件,現在想讓它消失,但用Edit.Free後,呼叫Edit.Text卻仍然存在……我們知道,光Free是不行的,這只是將Edit所指向的記憶體空間釋放了,但是指標並沒有設定為nil,當呼叫Edit.Text時,Delphi仍然會根據Edit提供的指標訪問已經釋放的記憶體區域,所以會產生Access Violation ....錯誤。所以我們需要在FreeEdit:=nil或者FreeAndNil(只在Delphi5下有效)將指標nil掉,才能保證以後的正常執行。

C.將各控制元件的提示文字顯示於狀態行上。這個可用ApplicationOnHint事件,但由於Application為不可件物件,因此可以採用如下方法:

......

public

procedure DisplayHint(Sender: TObject); //宣告一個方法用於顯示提示文字

end;

......

procedure TForm1.DisplayHint(Sender: TObject); //實現部分

begin

StatusBar1.SimpleText := GetLongHint(Application.Hint);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Application.OnHint := DisplayHint;

end;

這樣顯示在狀態列裡的文字和提示框(就是那個自動出現的黃色小框)裡的是一樣的。如果想要在狀態列裡的提示文字更加詳細怎麼辦?其實,只要控制元件的Hint屬性這樣寫:MyHint|It's just a MyHint!,就可以讓“|”前的內容顯示在提示框(Help Hint box)裡,“|”的後面的內容顯示在狀態列裡了。

D.ListView使用中的一些要點。以下以一個兩列的ListView為例。

增加一行:

with ListView1 do

begin

ListItem:=Items.Add;

ListItem.Caption:='第一列內容';

ListItem.SubItems.Add('第二列內容');

end;

清空ListView1

ListView1.Items.Clear;

得到當前被選中行的行的行號以及刪除當前行:

For i:=0 to ListView1.Items.Count-1 Do

If ListView1.Items[i].Selected then //i=ListView1.Selected.index

begin

ListView1.Items.Delete(i); //刪除當前選中行

end;

當然,ListViewOnSelectItem事件,可以判斷選擇了哪行,用個全域性變數把它賦值出來。

讀某行某列的操作:

Edit1.Text := listview1.Items[i].Caption; //讀第i行第1

Edit2.Text := listview1.Items[i].SubItems.strings[0]; //讀第i行第2

Edit3.Text := listview1.Items[i].SubItems.strings[1]; //讀第i行第3

以次類推,可以用迴圈讀出整列。

將焦點上移一行:

For i:=0 to ListView1.Items.Count-1 Do

If (ListView1.Items[i].Selected) and (i>0) then

begin

ListView1.SetFocus;

ListView1.Items.Item[i-1].Selected := True;

end;

不過在Delphi6中,ListView多了一個ItemIndex屬性,所以只要

ListView1.SetFocus;

ListView1.ItemIndex:=3;

就能設定焦點了。

==其他==

為了最佳化軟體,使其精益求精,當用到陣列時經常採用動態陣列。在宣告時,如:A : array of string,然後在使用陣列之前,SetLength(A,3)設定陣列長度為3,即A[0],A[1],A[2],這樣就可以了。當需要擴大陣列長度時,再一次:SecLength(A,5),那麼,就增加了A[3]A[4],而前面的A[0],A[1],A[2]裡的值不會清空;同樣,如果SecLength(A,3)後再SecLength(A,1)的話,就只剩A[0]了,A[1]A[2]自動被清除記憶體。注意:動態陣列是從“0”開始的,所以SetLength(A,1)High(A)=0的!!

最後當不再用這個動態陣列了,而程式還沒有要退出,那為了節省記憶體用:A:=nil來釋放掉這個陣列,這下真正達到了綠色環保:)

•“怎麼獲取當前程式執行的路徑這個問題經常能夠在論壇上看到。的確,這個函式在程式設計中不時的要用到的。其實有好幾個函式都能達到這個效果:

GetCurrentDirectory()WinAPI函式,具體用法如下:

var

MyCurrentDir:Array[0..144] of Char; //儲存當前絕對路徑

begin

GetCurrentDirectory(SizeOf(MyCurrentDir),MyCurrentDir); //取得當前絕對路徑,最後得到的格式如:C:WINDOWSSYSTEM

MyCurrentDir:=MyCurrentDir+'MySoftName.exe';

end;

GetCurrentDir()GetCurrentDirectory經過Delphi封裝後的一個函式,用法簡單:MyCurrentDir:=GetCurrentDir。最後得到的格式如:C:WINDOWSSYSTEM

還有就是可以直接得到路徑的函式:ExtractFilePath(ParamStr(0))ExtractFilePath(Application.exename)等。

系統的關機、重新啟動等操作的訊息。這也是一個常有人問的問題,在此我也順便在提一下:

關機:ExitWindowsEx(EWX_SHUTDOWN,32);

重新啟動:ExitWindowsEx(EWX_REBOOT,32);

登出:ExitWindowsEx(EWX_LOGOFF,32);

關閉電源:ExitWindowsEx(EWX_POWEROFF,32);

Delphi中,除了使用#39外,要在程式中(如ShowMessage中)顯示單個單引號要如何處理?''''''''都會出現編譯錯誤。其實,是四個單引號表示一個單引號,也就是是 '''',第二個和第三表明這是一個“'”,第一個和第四個是表明這是一個字元型。呵呵,很有趣哦:)

•ShowMessage中的漢化問題。ShowMessage中的按鈕都是E文的,讓人很不舒服。其實經過我們的一番DIY,也能把它們都弄成中文的。

首先要儲存當前的工程,然後選Project|Languages|Add...,出現Add Language對話方塊,選擇你要漢化的工程(也可以自定義資料夾),Next;選最後一項中文(中國)NextNextNextFinishOK;然後就出現了Translation Manager對話方塊,在左邊選中文(中國)|Resource Scripts|Projet1_DRC(這個具體要看你的工程檔名),然後右邊的列表裡找到“Const_SMsgDlgOK”項,將其的中文(中國)(translated)”格改為確定(原為OK),儲存後退出。這下,再執行一下程式,哈哈,是不是就是中文按鈕啦!

不過,ShowMessage這種型別的資訊對話方塊非常簡單了,可以在系統除錯期間顯示給開發人員一些過程資訊。但由於過於簡單,所以我建議在軟體的正式版中不要使用這樣的對話方塊。而且,最好用MessageBox代替ShowMessage以減小軟體的體積,例如,同樣一個DLL檔案,採用MessageBox 編譯後的DLL檔案大小為58K,而ShowMessage後就變成了301K!!

上面這些經驗也許你並不是就一定用的到,但所謂書到用時方恨少!廢話無需多說,大家鼓鼓掌吧,嘻嘻:)有不足之處,還請各位前輩指教!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/787895/viewspace-1009721/,如需轉載,請註明出處,否則將追究法律責任。

相關文章