[Delphi]Delphi開發的一些技巧

1、提升查詢效率先進行準備查詢操做:數據庫

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

2、要在運行期訪問參數,有三種方式能夠選擇:(適合BDE控件中的TQuery)編程

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

複製代碼
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]);
複製代碼

3、要讓用戶能夠在數據控件中編輯查詢出來的結果:服務器

Query1.RequestLive:= True。

注:設置RequestLive:= True並不能保證「實時數據結果集」。函數

4、釋放SQL語句佔用的資源spa

CustomerQuery.UnPrepare;

UnPrepare方法設置Prepared爲False。它的工做主要是:設計

(1)再進行查詢以前保證SQL屬性已經準備好
(2)「通知」BDE釋放掉爲SQL語句分配的內部資源
(3)「通知」數據庫服務器釋放掉爲SQL語句分配的內部資源
提示:在改變TQuery的SQL屬性的時候,TQuery構件自動關閉和釋放佔用的資源指針

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

CustomerQuery.Close;
CustomerQuery.Open; 

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

好比INSERT, UPDATE, or DELETE,直接調用ExecSQL。好比:

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

6、在運行期間執行查詢(動態查詢)
若是在設計期間沒法肯定是否要返回查詢結果,能夠用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;
複製代碼

7、在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.五、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;
複製代碼
相關文章
相關標籤/搜索