加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi开发的一些技巧

发布时间:2020-12-15 09:54:41 所属栏目:大数据 来源:网络整理
导读:[Delphi]Delphi开发的一些技巧 一、提高查询效率先进行准备查询操作: CustomerQuery.Close;if not (CustomerQuery.Prepared) then --查询是否已准备好CustomerQuery.Prepare; -->查询准备CustomerQuery.Open; -->执行查询 二、要在运行期访问参数,有

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读