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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐