[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;
● 访问指定字符串:
● 查找字符串的位置:
FileListBox1.Items.IndexOf(‘AUTOEXEC.BAT‘)
注:只能找与完整字符串匹配的,不能查找部分字符串.(返回位置的值)
● 往列表中加入字符串:1.Add 2.Insert(2,‘Three‘)如果不到三个产生异常.
● 在列表中移动字符串:Move(2,4);//将第三个字符串移到第五个
● 复制一个完整的字符串列表:
● 删除列表中的字符串: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
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] 举报,一经查实,本站将立刻删除。