1. 程式人生 > >Delphi開發的一些技巧

Delphi開發的一些技巧

[Delphi]Delphi開發的一些技巧

一、提高查詢效率先進行準備查詢操作:

CustomerQuery.Close;
if not (CustomerQuery.Prepared) then -->查詢是否已準備好
CustomerQuery.Prepare; -->查詢準備
CustomerQuery.Open; -->執行查詢

二、要在執行期訪問引數,有三種方式可以選擇:(適合BDE控制元件中的TQuery)

(1)ParamByName: 按名稱設定引數的值
(2)Params: 按序號設定引數的值
(3)Params.ParamValues 屬性按名稱設定引數的值。這種方法可以在一行中設定一個或者多個引數的值
假設一條SQL語句有三個引數:

INSERT INTO "COUNTRY.DB" 
(Name, Capital, Continent)
VALUES (:Name, :Capital, :Continent)
(1)Query1.Params[1].AsString := Edit1.Text; 
(2)Query1.ParamByName('Capital').AsString := Edit1.Text;
(3)Query1.Params.ParamValues['Country;Capital;Continent'] := VarArrayOf([Edit1.Text,Edit2.Text, Edit3.Text]);

三、要讓使用者可以在資料控制元件中編輯查詢出來的結果:

Query1.RequestLive:= True。

注:設定RequestLive:= True並不能保證“實時資料結果集”。

四、釋放SQL語句佔用的資源

CustomerQuery.UnPrepare;

UnPrepare方法設定Prepared為False。它的工作主要是:

(1)再進行查詢之前保證SQL屬性已經準備好
(2)“通知”BDE釋放掉為SQL語句分配的內部資源
(3)“通知”資料庫伺服器釋放掉為SQL語句分配的內部資源
提示:在改變TQuery的SQL屬性的時候,TQuery構件自動關閉和釋放佔用的資源

五、(1)執行返回結果的查詢

CustomerQuery.Close;
CustomerQuery.Open; 

(2)執行不返回結果的查詢

比如INSERT, UPDATE, or DELETE,直接呼叫ExecSQL。比如:

CustomerQuery.ExecSQL; { query does not return a result set }

六、在執行期間執行查詢(動態查詢)
如果在設計期間無法確定是否要返回查詢結果,可以用Try...Except結構把這兩個過程都寫進去,一般Open在Try部分呼叫,而ExecSQL在Except部分呼叫,這樣,即使Open呼叫失敗,也能執行到ExecSQL。可以在Except部分截獲異常的型別。如果這個異常不是ENoResult異常,那麼這個異常一定是其他原因引起的,必須被處理。

try
Query2.Open;
except
on E: Exception do
if not (E is ENoResultSet) then
raise;
end;

七、在DELPHI中嵌入彙編

Procedure TForm1.Button1Click(Sender:TObject);
begin
ASM
push bx //此行彙編必須要有,且在第一行
mov ax,0ffh
add ax,033h
pop bx //必須恢復BX暫存器,
//否則系統出現不可預料的錯誤,小心當機
END; 
end;

八 字串列表的常用操作 

● 計算列表中字串數目:

FontCount:=Screen.Fonts.Count;

● 訪問指定字串:

Memol.Lines.Strings[0]:='This is the first line.';
<=> Memol.Lines[0]:='This is the first line.'; 

● 查詢字串的位置:

 FileListBox1.Items.IndexOf('AUTOEXEC.BAT') 

注:只能找與完整字串匹配的,不能查詢部分字串.(返回位置的值)

● 往列表中加入字串:1.Add 2.Insert(2,'Three')如果不到三個產生異常.
● 在列表中移動字串:Move(2,4);//將第三個字串移到第五個
● 複製一個完整的字串列表:

Outline1.Lines:=ComboBox1.Items; //複製列表 <覆蓋>
Outline1.Addstrings(ComboBox1.Items); //連線列表 <加到尾部>

● 刪除列表中的字串:Delete(i:integer) i:0..n

With ListBox1.Items do
begin 
if Indexof('bureaucracy')>-1 then
Delete (Indexof('bureaucracy'));
end; 

● 裝載、儲存字串列表:

以下程式碼裝入AUTOEXEC.BAT的檔案,並以AUTOEXEC.BAK為檔名進行備份。

procedure TForm1.FormCreat(sender:TObject);
var
FileName:String;
begin
FileName:='C:/AUTOEXEC.BAT';
With Memo1 do
begin
LoadFromFile(FileName)
SaveToFile(ChangeFileExt(FileName,'BAK'));
end;
end;

九 對檔案的操作:

●文字檔案: 定義: var TextFileVar: Text ; 
1. 文字檔案的開啟需要兩個步驟:
(1). 檔案變數與檔名關聯;
AssignFile ( TextFileVar , FileName ) ; 
(2). 初始化讀寫(三種方式)
1>. Reset : 為讀開啟檔案並把檔案指標移動到檔案首;
2>. Rewrite : 為寫建立一個新檔案;
3>. Append : 為寫開啟存在的檔案並把檔案指標定位在檔案尾。
注:當使用Reset或Append過程而檔案不存在時將會引發一個I/O異常。
  I/O異常類EInOutError是在程式執行中試圖對檔案或外設進行操作失敗 後產生的,它從Exception派生後增加了一個公有資料成員ErrorCode,用於 儲存所發生錯誤的程式碼。這一成員可用於在發生I/O異常後針對不同情況採取不 同的對策。
  當設定編譯指示{$I- } 時,不產生I/O異常類而是把錯誤程式碼返回到預定 義變數IOResult中。 
2. 文字檔案的關閉: CloseFile
3. 文字檔案的讀寫: read(ln)(TextFileNameVar,num1,num2,...)
4. 文字檔案的編輯: Memo1.Lines.LoadFromFile ( TextFileName ) 
Memo1.Lines.SaveToFile ( TextFileName );

●記錄檔案  var RecordFileVar: file of RecordType
●無型別檔案
無型別檔案提供了底層的I/O通道,可用於存取可變長度記錄的檔案。經常用
於檔案的複製操作中。DELPHI中有更好的方法如下,所以無型別檔案很少使用。可
參看BlockRead、BlockWrite兩個聯機幫助主題。 
●Delphi的檔案管理標準過程: 
1. 檔案的開啟與關閉:
AssignFile : 把一個外部檔名和一個檔案變數相關聯
Reset : 開啟一個存在的檔案
Rewrite : 建立並開啟一個新檔案(或覆蓋原有檔案)
Append : 以新增方式開啟一個檔案(只適用於文字檔案)
CloseFile : 關閉一個開啟的檔案
FileOpen : 開啟一個特定的檔案並返回檔案控制代碼
FileCreate : 建立一個給定檔名的檔案並返回檔案控制代碼
FileClose : 關閉一個特定控制代碼的檔案 
注:後邊三個檔案主要供系統內部使用,在檔案複製的程式設計中
也往往會用到。它們操作的物件是檔案控制代碼而不是檔案變數。 

2. 檔案定位:
Seek : 把檔案當前位置移到指定部分
FilePos : 返回檔案的當前位置
Eoln : 返回行結束標誌
EOF : 返回檔案結束標誌
FileSeek :改變當前檔案指標的位置
注意:Seek與FileSeek的區別是:
<1>. Seek僅用於記錄檔案;
<2>. FileSeek的引數是檔案控制代碼、偏移量、起始位置。其中起始位置有檔案
首、當前位置、檔案尾三種選擇。Seek的引數是檔案變數、偏移量,偏移量是
從檔案首開始定位的。3. FileSeek的偏移量以位元組數來計算,而Seek是根
據記錄號進行移動。 <例程參見DELPHI初級教程檔案管理(二)>

3.檔案刪除與截斷: 
Erase : 刪除一個存在的檔案
DeleteFile : 刪除一個檔案
Truncate : 從檔案當前位置將檔案截斷 
注意:Erase與DeleteFile的區別是:Erase以檔案變數為引數,當檔案不能
刪除時引起一個異常;DeleteFile以檔名為引數,當檔案不存在或不能刪
除時返回False,而並不引起一個異常。

4.件名操作 
Rename : 檔案更名,以檔案變數為操作物件
RenameFile : 檔案更名,引數為檔案的原名和新名
ChangeFileExt : 改變副檔名
ExpandFileName : 返回檔案全路徑名
ExtractFileExt : 返回副檔名
ExtractFileName : 從全路徑名中返回檔名
ExtractFilePath : 返回特定檔案的路徑 

5.檔案屬性 
FileGetAttr :返回檔案屬性
FileSetAttr :設定檔案屬性 

6.檔案狀態 
FileSize :返回檔案物件大小
IOResult :返回上一次I/O操作的狀態
FileExists :檢測檔案是否存在 

7.檔案日期
DateTimeToFileDate :把Delphi日期格式轉換為DOS日期格式
FileDateToDateTime :把DOS日期格式轉換為Delphi日期格式
FileGetDate : 返回檔案的DOS日期時間戳
FileSetDate : 設定檔案的DOS日期時間戳 

8.檔案讀寫
Read,Readln :從文字或記錄檔案中讀取變數
Write : 將指定變數寫入文字或記錄檔案
Writeln : 將指定變數寫入文字檔案並寫入一個行結束標誌
FileRead : 從一個指定檔案中讀取變數
FileWrite : 向指定檔案寫入資料 
FileRead和FileWrite都是以檔案控制代碼為操作物件,主要供系統內部使用。

9.目錄操作 
MkDir :建立當前目錄的子目錄
ChDir :改變當前目錄
GetDir :返回特定磁碟的當前目錄
RmDir :刪除一個空子目錄 

10.磁碟操作 
DiskFree :返回磁碟自由空間
DiskSize :返回特定磁碟的大小 
6.1.4.11 檔案查詢
FileSearch :查詢目錄中是否存在某一特定檔案
FindFirst :在目錄中查詢與給定檔名(可以包含匹配符)及屬性集相匹
配的第一個檔案
FindNext :返回符合條件的下一個檔案
FindClose :中止一個FindFirst / FindNext序列 

十 使用剪貼簿傳輸文字 (三個方法)
1. CopyToClipboard
2. CutToClipboard 
3. PasteFromClipboard

十一 對字串的操作:
1. 一個典型函式:

function StringStatus (const Str: string): string;
begin
Result := '地址:' + IntToStr (Integer (Str)) +
',長度:' + IntToStr (Length (Str)) + 
', References: '+IntToStr(PInteger(Integer(Str)-8)^) +
', 值: ' + Str;
end;

2. 格式化字串:

Format ('First %d, Second %d', [n1, n2]);
Format ('%8d', [n1]);該句把數字n1轉換成有8個字元的字串,並通過填充d 空白使文字右對齊,左對齊用減號(-) 。


十二 型別
1. 字元型別: #78<=>Chr(78) Ord(k)=78
#9 跳格 (Tab 鍵); #10 換行; #13 回車 (Enter 鍵)

2. 有序型別:
例程 作用 
Dec 將例程中的引數值遞減1或一個特定的值,其中特定值可在
第二個可選引數中定義 
Inc 將例程中的引數值增加1或一個特定的值 
Odd 如果引數為奇數返回真 
Pred 根據引數在其資料型別定義中的序列,返回引數值的前驅值
Succ 返回引數值的後繼值 
Ord 返回引數值在其資料型別值集合中的序號 
Low 返回引數對應的有序資料型別的最小取值 
High 返回引數對應的有序資料型別的最大取值

3. 日期時間型別
例:FormatDateTime('yyyy''年''mm''月''dd''日',Now)
Now:返回當今日期時間 Date:返回當今日期 Time:返回當今時間
DayOfweek: 根據傳遞的日期引數計算該日期是一星期中的第幾天
DecodeDate: 根據日期值返回年.月.日值
DecodeTime: 根據時間值返回時.分.秒.毫秒
EncodeDate: 組合年.月.日值為TDateTime型別值
EncodeTime: 組合時.分.秒.毫秒值為TDateTime型別值

4. 型別轉換系統例程
  例程 作用 
Chr 將一個有序資料轉換為一個ANSI字元 
Ord 將一個有序型別值轉換為它的序號 
Round 轉換一個實型值為四捨五入後的整型值 
Trunc 轉換一個實型值為小數截斷後的整型值 
Int 返回浮點數的整數部分 
IntToStr 將數值轉換為字串 
IntToHex 將數值轉換為十六進位制數字符串 
StrToInt 將字串轉換為一個整型數; 
StrToIntDef 字串轉換為一個整數,如字串不合法返回一個預設值
Val 將字串轉換為一個數字 
Str 將數字轉換為格式化字串
StrPas 將零終止字串轉換為Pascal型別字串,在32位
Delphi中這種型別轉換是自動進行的 
StrPCopy 拷貝一個Pascal型別字串到一個零終止字串, 在32
位Delphi中這種型別轉換是自動進行的 
StrPLCopy 拷貝Pascal型別字串的一部分到一個零終止字串 
FloatToDecimal 將一個浮點數轉換為包含指數、數字及符號的十進位制
浮點記錄型別 
FloatToStr 將浮點值轉換為預設格式的字串 
FloatToStrF 將浮點值轉換為特定格式的字串 
FloatToText 使用特定格式將一個浮點值拷貝到一個字串緩衝區
FloatToTextFmt 使用特定格式將一個浮點值拷貝到一個字串緩衝區
StrToFloat 將一個Pascal字串轉換為浮點數 
TextToFloat 將一個零終止字串轉換為浮點數
注意:在最近版本的Delphi Pascal 編譯器中,Round 函式是以
CPU 的 FPU (浮點部件) 處理器為基礎的。這種處理器採用了所謂的
"銀行家舍入法",即對中間值 (如 5.5、6.5) 實施Round函式時,
處理器根據小數點前數字的奇、偶性來確定舍入與否,如 5.5 Round
結果為 6,而 6.5 Round 結果也為6, 因為 6 是偶數。

十三 回車替Tab下移控制元件

需要用回車鍵代替TAB鍵下移一個控制元件時,把KeyPress設為True,加
入下列程式碼攔截擊鍵:

Procedure TForm1.FormKeyPress(Sender:Tobject;Var Key:Char);
Begin
 if key=#13 then { 判斷是按執行鍵}
 if not (ActiveControl is TDbgrid) Then
 Begin { 不是在TDbgrid控制元件內}
  key:=#0;
  perform(WM_NEXTDLGCTL,0,0);{移動到下一個控制元件}
 end else
 if (ActiveControl is TDbgrid) Then{是在 TDbgrid 控制元件內}
 begin
  With TDbgrid(ActiveControl) Do
  if Selectedindex<(FieldCount-1) then
  Selectedindex:=Selectedindex+1{ 移動到下一欄位}
  else Selectedindex:=0;
 end;
End;