Delphi开发的一些技巧 - 李龙江

Delphi开发的一些技巧

2013-06-06 18:41 李龙江 阅读(3509) 评论(0) 编辑收藏举报

[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;