?? delphi經驗技巧集錦.txt
字號:
Delphi經驗技巧集錦
--------------------------------------------------------------------------------
第八軍團 時間:2003-12-29 12:38:26
---- 一.為列表框添光彩
---- 為了改變Listbox和Combobox兩個控件的單調風格, 我想在它們的每一項前面加上個圖標。從表面上看好像不大可能啦。就在走投無路的時候,我忽然發現這兩個構件都有一個style屬性, 它可以設為lbOwnerDrawFixed,Draw這個單詞吸引了我,然后我又從Delphi的在線幫助中找到了一個相關的事件OnDrawItem,在這個事件中寫一段代碼,就可以在列表框中的每一項前面添加一個小圖標啦。
---- 下面是在Listbox 的OnDrawItem事件中添加的代碼:
procedure Tform1.ListBox1DrawItem(Control:
TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
Bitmap: TBitmap;
Offset: Integer;
begin
with (Control as TListBox).Canvas do
begin
FillRect(Rect);
Offset := 2;
Bitmap := TBitmap.create;
Bitmap.LoadFromFile(′d:temp11.bmp′);
//指定圖文件是d:temp11.bmp
BrushCopy(Bounds(Rect.Left + 2, Rect.Top,
Bitmap.Width, Bitmap.Height),
Bitmap, Bounds(0, 0, Bitmap.Width,
Bitmap.Height), clRed);
Offset := Bitmap.width + 6;
TextOut(Rect.Left + Offset, Rect.Top,
(Control as TListBox).Items[Index])
end;
end;
---- 進一步,利用OnDrawItem事件的參數Index還可以在不同項前面添加不同的圖標。還要告訴你的是, 當用add方法為列表框或下拉框添加項目時, 會自動執行 OnDrawItem事件,這樣新添加的項目前面也就有了一個圖標。
---- 二.獲取count值
---- Delphi與Power Builder一樣,都提供了SQL語言,來實現對數據庫的訪問,僅僅是實現語句的長短不同。Delphi是在Pascal語言基礎之上發展起來的,它提供了強大的功能,各種控件提供了豐富的屬性和方法。我們應該充分利用這些屬性和方法。要想知道某數據庫的記錄數, 用一個簡單的語句即可完成。例如求Delphi的DBDemos數據庫中表 day.db的記錄總數,假設Table控件已加到form上,具體實現語句為:
Edit1.text:=inttostr(Table1.recordcount);
如果是要知道符合某條件的記錄數,也非常方便,具體實現語句為:
Edit1.text:=inttostr(Query1.recordcount);
Recordcount屬性用來表示為數據集相連的表的記錄總數。
還有一種通用的方法,具體實現語句為:
VAR i:integer;
Begin
i:=0;
Table1.open;
Table1.First;
While not Table1.eof do
BEG1N
i:=i+1;
Table1.next;
End;
Edit1.text:=inttostr(i);
如果使用了TQuery控件,具體步驟如下:
Query1.close;
Query1.SQl.clear;
query1.SQL.add (′ ...... ′);
//某查詢語句
Query1.open
Query1.first;
i:=0;
While not Query1.eof do
BEG1N
i:=i+1;
Query1.next;
EnD
Edit1.text:=Inttostr(i);
---- 三.給數據庫報表加上網格線
---- Delphi 1.0和2.0版捆綁了Reportsmith報表制作工具,實現報表打印。如果打印一個很簡單的報表,在程序中啟動Reportsmith,就顯得比較麻煩。對于比較簡單的報表,我們一般按本報63期相應文章的方法實現報表打印。例如,用Delphi 1.0編寫的商業財務軟件《保靈商務營銷管理系統》中報表打印就是自主開發的,整個系統顯得短小、整體性比較好。Delphi 3.0和Delphi 4.0就不再捆綁Reportsmith,但增加了QReport組中報表控件的功能, 使得報表制作更加靈活。給報表加上網格線就太容易了。在QReport 組件中用來顯示數據的TQRExpr。 它就有一個Frame屬性, 按下 F11鍵, 在 “Object inspect”中,修改“Frame”屬性,它提供7個子屬性,其功能如下:
Color 顯示網格線顏色
style 報表網格線的形狀,如實線、虛線等
Width 網格線的寬度
DrawBottom 網格的底部
Drawlefl 網格的左邊
DrawRight 網格的右邊
DrawTop 網格的底部
---- 在制做報表前,最好在數據庫表中添加幾個記錄,然后根據需要修改這些屬性,使用報表的預覽功能在設計期間看修改效果,不滿意可立即修改。
---- 四.定制Speedbar
---- 在Delphi的可視化設計界面中,使用最頻繁的地方要數位于屏幕左上角的加速按鈕欄(Speedbar)了。在實踐過程中,筆者無意中發現了Speedbar的定制方法,這在我用過的四本Delphi參考書中均未提及到。步驟如下:
---- 右鍵點擊Speedbar, 在彈出菜單中選Properties, 這時會出現一個名為Speedbar Editor的對話框。假設想要增設一項“語法檢查”的功能,可在左邊Categories列表框中選Project, 再把右側的Syntax Check圖標拖放到Speedbar的合適的位置上,這項功能就已經加上了。 如果speedbar上沒有多余的空間來容納新的按鈕, 可將鼠標停在 speedbar右框處,變為雙向箭頭的形狀時,向右拖動一段距離,就可騰出空間。如想刪除speedbar上的某個按鈕,可簡單地把它拖出speedbar的范圍,就能刪除。操作十分方便。 建議把Syntax Check、 Project Options(工程選項) 、 WindowsApi Help加到 Speedbar中,可以提高開發效率。
---- 五.設計form時的快捷鍵
---- 使用快捷鍵可以加快設計速度。下面列出的快捷鍵,可根據實際情況,有選擇地熟練掌握。
Del :刪除所選組件;
Esc :選擇當前組件的容器(通常是Panel,Group或form);
F11 :在form或Unit和對象檢查器之間切換;
F12 :在form和代碼編輯器間切換;
Ctrl+F12 :顯示“查看Unit”對話框;
Shift+F12 :顯示“查看form”對話框;
TAB :下一個組件;
Shift+TAB :上一個組件;
方向鍵 :選中此方向上最近的組件;
Ctrl+方向鍵 :將所選組件移動一個點;
Shift+方向鍵 :將所選組件改變一個點的大小;
Ctrl+Shift+方向鍵 :將所選組件移動一個格;
Shift+click :按住Shift鍵再用鼠標點擊組件,可以選擇多個組件。
---- 下面這條是我摸索出來的: Ctrl+drag :按住Ctrl鍵在一個容器組件(如Panel,QReport,Groupbox等)里拖動鼠標,可強制選擇鼠標拖過的矩形框中的所有屬于此容器的可視組件(不包括該容器組件)。
---- 六.命令行參數的使用
---- Delphi提供了訪問命令行參數的方便的方式,那就是使用ParamStr和ParamCount函數。其中ParamStr(0)返回的是當前程序名,如C:TESTMYPROG.EXE,ParamStr(1)返回第一個參數,以此類推;ParamCount則是參數個數。示例如下:
var
I: Word;
Y: Integer;
begin
Y := 10;
for I := 1 to ParamCount do begin
Canvas.TextOut(5, Y, ParamStr(I));
Y := Y + Canvas.TextHeight(ParamStr(I)) + 5;
end;
end;
---- 七.DCU文件(編譯的庫單元)的重用
---- (1)在interface里的uses子句中引用。如Windows,Dialogs等,要求被引用的DCU一定要放在Delphi4Lib子目錄中。
---- (2)在implementation里的uses子句中引用。如果是自行編寫的DCU文件,應采用這一方式,并將被引用的DCU文件放入當前工程所在的子目錄中。
---- 八.使用字符串資源的技巧
---- 不同于其它資源,字符串資源不能直接編輯,需要先按格式編制一個文本文件,再用程序將其編譯成資源文件。下面用一個簡單的例子來說明。首先用文本編輯器編一個文件lb.rc,其內容如下:
STRINGTABLE
BEGIN
1,"開始"
2,"退出"
END
---- 然后, 找到Delphi的Bin子目錄下的BRCC32.EXE文件進行編譯, 命令格式為: BRCC32 LB.RC,編譯結束后即生成一個資源文件lb.res。要使用該資源文件,需要在單元文件implementation部分的開始處包括資源文件:{$R LB.RES}。在本例中,上面的字符串用于給一個命令按鈕更換Caption設置, 使用的函數是Windows API函數 LoadString,以下是使用實例:
//在formCreat過程中:
var
txtCaption:array [0..255] of char;
begin
//
if LoadString(HInstance,1,txtCaption,SizeOf
(txtCaption))〉0 then
btnStart.Caption:=StrPas(txtCaption);
end;
//在btnStartClick過程中:
var
txtCaption:array [0..255] of char;
begin
if LoadString(HInstance,2,txtCaption,
SizeOf(txtCaption))〉0 then
btnStart.Caption:=StrPas(txtCaption);
end;
---- 這樣就可以在程序運行時改變各種屬性,而不需要在程序中出現字符串。如果使用另一個Delphi函數LoadStr,會顯得更加簡單:
var
txtCaption:String;
begin
txtCaption:=LoadStr(2);
if txtCaption〈〉′′ then
btnStart.Caption:=txtCaption;
end;
---- 或許大家可以從以上的過程中看出, 使用123來標識一個字符串有些簡陋,也很容易出錯,那么怎么辦呢?我們可以采取像C++中使用字符串的方法,為每個字符串預定義一個ID,如:
const
IDC—START=1;
IDC—EXIT=2;
---- 當然要把它放在一個unit里(類似于C++的.h文件) ,在使用的單元里再uses一下就可以了,這樣應用感覺是不是很爽呢?
txtCaption:=LoadStr(IDC—EXIT);
---- 九.讓圖像旋轉
---- Delphi中的Image構件可以顯示位圖,進一步,我們還可以用它完成位圖旋轉。
---- 把一個點繞原點旋轉α角度后,新的坐標位置與原坐標位置的關系是:
X=x
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -