DELPHI编程技巧集锦.doc_第1页
DELPHI编程技巧集锦.doc_第2页
DELPHI编程技巧集锦.doc_第3页
DELPHI编程技巧集锦.doc_第4页
DELPHI编程技巧集锦.doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DELPHI编程技巧集锦(1)董占山(中国农科院棉花研究所,河南安阳,455112)美国著名的Delphi开发者杂志(Delphi Developers Journal)是世界上众多Delphi程序员必读的专业杂志,在国内我们很少有机会读到这份优秀的专业刊物,但是我们可以在Inprise公司()的网页上看到该杂志刊登的一些优秀文章。同时,还可以通过电子邮件订阅该杂志免费提供的Delphi使用技巧,订阅网址为/ddj/bor-f.htm。笔者从中筛选出一些十分有用的Delphi使用技巧和文章,编译出来,与广大Delphi爱好者分享。有什么意见和建议可以直接给笔者发电子邮件()。读者请注意,本文中的内容多以Delphi 4为例进行介绍,请使用其他版本的读者根据实际情况灵活运用。一、Delphi集成环境与代码调试A 修改Delphi的系统信息默认的Delphi消息、警告和例外描述都是英文的,将这些内容翻译成另一种语言或修改它们使其适合你的需要的最简单方法是编辑资源文件并改变相应的字符串,这些文件位于BIN目录。主要资源文件有:SysUtils单元的信息(文件没有找到、转换错误信息等)在sysutils.res中,数据库错误信息在dbconsts.res中,VCL信息在consts.res中。注意一些字符串使用格式字符,如%s或%d,来产生最终的字符串,在这种情况下,应将这些字符保留在适当的位置。B 如何清除无用代码Delphi提供了自动清除源代码中无用代码的强大功能,一般来说,当你保存文件时,Delphi自动将源代码中空的类方法删除,保证了源代码的清洁。在没有编译和保存文件的前提下,也可以清除无用代码,方法是:在Delphi 3/4中单击“File”*“Save As.”菜单命令(在Delphi 1/2中单击“File”*“Save File As.”菜单命令),打开“Save As.”对话窗口,单击“取消”按钮即可。C 在Delphi 4集成环境中不使用浮动功能你无疑知道Delphi 4集成环境支持大多数窗口的浮动功能。但是,有时你不想让一个窗口具有浮动功能。浮动窗口在需要时,十分有用,但在不需要时,也十分恼人。有两种方法可以改变一个窗口的浮动属性。第一种方法是:每个可浮动窗口具有一个本地菜单项目-Dockable,如果你不希望一个特定的窗口具有浮动功能,简单地用鼠标右键单击窗口,选空Dockable菜单项目。这个窗口的浮动功能就关闭了,直到你再选中Dockable项目为止。这一技术可以防止特定的窗口可停靠。但有时,你仅仅希望暂时关闭浮动功能,这时,只需要按下键,再拖动窗口。D 在工具菜单中添加项目在Delphi集成环境中按F1键可以打开多数Delphi帮助标题,这种方法可以快速打开相关标题的帮助窗口。但是这种快速方法对第方工具和常问问题(FAQs)是不可用的,Delphi提供了一个变通的方法,使在集成环境下快速打开这些工具成为可能。在工具菜单添加用户项目的方法是:单击“Tools”*“Configure Tools”命令,打开一个包含所有可用工具列表的对话窗口,单击“Add”按钮,打开“Tool Properties”对话窗口,分别设置4个编辑框,然后单击“Ok”按钮,再单击“Close”按钮,完成设置。E 设置条件断点一般来说,大家都会使用断点来调试程序,但是如何使用条件断点来调试程序呢?条件断点,顾名思义,就是指需要满足一定条件时的断点。这种断点在调试很长的For或While循环时十分有用,当你只希望看一看一个特定循环的执行情况而非所有循环时,就需要在循环中设定一个条件断点,当设定的条件满足时,Delphi停止应用程序的执行。设置条件断点的方法是:按常规的方法建立断点,单击“View”*“Debug Windows”*“Breakpoints”命令,弹出一个断点列表窗口,用鼠标右键单击欲设置为条件断点的断点,在快捷菜单中单击“Properties”命令,打开一个断点编辑窗口,在这个窗口的条件域中输入一个逻辑表达式即可。在调试程序时,Delphi判断这个逻辑表达式,当逻辑表达式为真时,就中断程序运行,返回代码窗口。F 不要让集成调试器打断调试过程在调试程序时,Delphi的集成调试器监视一切运行时错误。当调试器发现一个运行时错误时,Delphi中断应用程序并返回到设计状态,并显示一个错误信息窗口。当关闭错误信息窗口后,需要按重新开始启动程序,或者按继续运行程序。无疑,Delphi集成调试器是十分有用的,但有时也让人烦恼。能否暂时关闭集成调试器呢?可以。使用下面的方法可防止集成调试器中断应用程序:1 单击“Tools”*“Environment Options.”菜单命令;2 单击“Preferences”对话页标签;3 选空“Integrated debugging option”复选框;4 单击“Ok”完成操作。这样当你在集成环境下调试应用程序时,Delphi的集成调试器探测到运行时错误时,就不再切换到设计状态并显示错误信息了。G 调试Delphi 3/4集成环境的插件在Delphi 1中, 要调试集成环境的插件/专家是十分困难的。Delphi 3/4提供了调试DLL的能力,从而简化了这项工作。第一步,保证插件/专家没有包括在Windows注册表的插件/专家列表中,然后,启动Delphi 3/4并装载需要调试的专家DLL,修改注册表,使Delphi 3/4能够调用这个DLL;第二步,单击“Run”*“Parameters”菜单命令,打开“Run Parameters”对话窗口,单击“Local”对话页上的“Host Application”编辑框右边的“Browse”按钮,查找“Delphi32.exe”程序的位置(本例为C:Program FilesBorlandDelphi4Bindelphi32.exe);第三步,运行待调试的DLL,将启动Delphi的第二个实例,并装载要调试的DLL,允许对其进行调试。二、窗体设计的相关技巧A 透明象素点当将一个image图象,一般为BMP文件,放到一个TBitBtn上时,图片左下角的一个象素点决定图片中的哪种颜色为透明色。图片上任何具有这种颜色的象素点,在按钮上都是透明的。假如不希望图片上的任何象素点是透明的,就需要将图片左下角的这个象素点的颜色设置为不同于图片上任何象素点的颜色。B 自动调整窗体的分辨率创建应用程序时,总是依监视器的分辨率进行的,其缺点是:假如在较高分辨率下设计应用程序,它可能大于用户的有效屏幕大小,在用户使用程序时,就不能显示出全部窗体内容,给用户带来不便。一种简单的解决办法是:在程序运行时,让Delphi自动添加滚动条来解决这个问题。但是,使用Delphi的自动调整比例过程将产生更加专业的结果。在运行时,Delphi获得系统的屏幕分辨率,并将结果保存在应用程序的Screen对象的PixelsPerInch属性中,然后,使用这个属性的值将窗体调整到当前分辨率。记住,为了有效地使用这项技术,需要设置窗体的Scaled属性为真,并且只用TrueType字体,如果开发程序时,使用了Windows的小字体,应将窗体的AutoScroll属性设置为假(FALSE)。 C 为控制设置一种自定义颜色窗体和各种控制都具有一个Color属性,当你选择它们的Color属性时,可以在列表框中选择一种Windows系统默认的各种颜色,也可以建立一种自定义颜色,使它们显得与众不同。为窗体或控制设定自定义颜色的步骤如下:1 双击组件的Color属性,弹出颜色对话窗口;2 选择一种最接近你想要的基色;3 单击“Define Custom Colors”按钮,颜色对话窗口将扩展,显示出一个色谱区域;4 使用十字光标在这个色谱区域选择你想要的颜色,然后单击“Add to Custom Colors”按钮;这样你选定的特定颜色就被添加到颜色对话窗口中了;5 单击“Ok”按钮,就将刚定义的颜色应用到选定的控件了。D 缩小步长大多数程序员在设计窗体时喜爱“(靠到格线)Snap to grid”功能,可以节省安置组件的时间,但是,有时你还需要微调其位置和大小。其一:将组件在窗体上一次移动一个象素点。首先,选中你想移动的组件,然后,按下键不放,按光标键,选中的控制将一次移动一个象素点,方向与光标键所指方向相同。其二:每次按一个象素点调整控制的大小。选中控制,按下键不放,按光标键,根据光标键所指方向不同,选中的控制每次放大或缩小一个象素点。E 控制滚动条的有效方法TForm的HorzScrollBar和VertScrollBar属性使用Tracking子属性来管理窗体的显示,Tracking属性是一个布尔型属性。若此属性设置为真,窗体随用户拖动滚动条而移动;若此属性设置为假,窗体不随用户拖动滚动块而移动,只有用户释放滚动块时才移动。这种差别对查看列表和图象的用户十分重要。如果要平滑地显示列表和图象,将Tracking属性设置为真,但当图象或列表信息特别复杂时,窗口的滚动特别地缓慢。如果要快速显示列表和图象信息,将Tracking属性设置为假,这样窗口的滚动就会加快,但是由于不能看到实际位置,所以使用时难以掌握。除了TForm以外,TScrollBox组件也使用Tracking属性来管理其显示内容。F 选择合适的组合框Delphi提供了5类组合框,它们具有相同的特性,但是也有不同的特点。了解其间的差别,可帮助程序员根据需要选择合适的组合框类型。所有的组合框都是一个列表框和编辑框的组合,用户可以在列表框中选择或在编辑框中直接输入值。当用户从列表框中选择时,这个条目将显示在编辑框中。5类组合框的不同特性决定了它们的显示和与用户交互的方式。下表列出了5种类型组合框的的独有特征。表1 格式描述格式 说明 Simple 这种格式就是列表框上显示一个编辑框,用户可以从列表框中选取条目,也可以直接在编辑框中输入文本 Drop-down 除了列表框开始不显示外,其他特性均类似于simple格式。在编辑框的左边有一个下拉按钮,单击可以打开列表框,从中选取条目;也可在编辑框中直接输入项目。 Drop-down list 这是组合框中限制条件最多的一种,显示格式类似于drop-down,开始时列表框不显示。用户单击下拉按钮打开列表框并从中选取条目,但是不能在编辑框中直接输入文本。 OwnerDrawFixed 这种组合框类似于Simple类,不同的是其列表框中的条目高度是根据用户在ItemHeight定义的值而设置的。 OwnerDrawVariable 这种组合框类似于OwnerDrawFixed类,特点是列表条目的高度是可变的。 当窗体上有足够的空间和列表很短时,使用Simple格式的组合框较为合适。否则,使用Drop-down格式的组合框。当想让用户只能从预定义项目中选取条目时,用Drop-down list格式的组合框。需要可变高度列表项时,使用后两种。G 使非可视组件易于辨认非可视组件没有标题属性,一个窗体中多个同类非可视组件时,由于它们看起来一模一样,故难以辨认。DELPHI提供了一种变通的方法,就是将非可视组件的名称放置在组件图标之下,使它们易于辨认。设置方法如下:1 单击“Tools”*“Environment Option”,弹出一个对话窗口;2 单击“Preferences”标签,切换到Preferences对话页;3 选中“Show component captions”复选框;4 单击“Ok”完成。这时,在当前的设计窗体上,就可以看到每个非可视组件下显示出一个标签。这个选项设置之后,对所有窗体都是有效的。H 标签的加速键对含有Caption属性的组件,添加快捷键是比较容易的,只需在Caption属性中特定字符前加上“&”符号即可。那么,怎样给没有Caption属性的控制添加快捷键呢?现以给一个TMemo控制添加快捷键为例说明如下:在窗体上放置一个TMemo控制,再在其旁边放置一个TLabel控制,将其Caption属性设置为“&Memo1”,将TLabel的FocusControl属性设置为“Memo1”。编译并运行这个程序,按快捷键 ,就可以快速存取Memo1控制的内容。这项技术不需要任何代码,可以应用到所有没有Caption属性的控件上。I 选择组件的父组件和多个组件在Delphi集成环境中,在设计窗体时,如果父组件是不可见的,要选择父组件就比较困难。其实有一个简单的方法:选择不可见组件的一个子组件,按键,就可以选中其父组件。当窗体上有多个组件时,可以通过按下鼠标左键拖动鼠标,将虚线矩形框包围要选择的组件,就可以方便地选择它们。但是, 如果想选择放置在一个面板类组件(如TPanel)上的一组组件时,单击并拖动将移动这组组件下的父组件,达不到预期的效果。为了避免这种情况的发生,需要按下键,然后再执行上述操作。另外,按下键,单击一个组件,可以选择或取消选择一个组件。这对需要选择不同面板组件上的子组件时十分有用。J 移动组件或调整其大小在窗体上移动组件或调整其大小时,有时希望一次一个象素点地进行。采用Object Inspector来修改组件的left, top, width和height属性可以做到这一点。但是还有一种更为简单的方法,就是使用和键加上箭头键。按组合键在箭头指向的方向上调整组件的大小;按组合键在箭头指向的方向上移动组件。这两种组合键对选定的多个组件同时有效。K 在TNotebook组件的所有页面上显示组件若希望在TNotebook或TPageControl组件的所有页面上显示某些组件(例如浏览数据库的列表框)时,不需要在在每个页面上重复设置这些组件,只需要首先建立它们,然后再添加TNotebook或TPageControl控件,调整它们的大小和位置,用鼠标右键单击TNotebook或TPageControl组件,单击弹出菜单中的“Send To Back”属性,这时最先添加的控件就显示在TNotebook或TPageControl控件之上,按通常的方法添加其他组件到TNotebook或TPageControl组件即可。此方法只对控件有效,所以TDBText需用TDBEdit代替,并设置其为只读,边界属性设置为空,Ctrl3D属性设置为假。同理,需要用TPanel组件代替TLabel组件。另一种更为有效的方法是编写一段代码,来动态改变组件的位置,这种方法对所有的组件均有效。以TPageControl为例,在其OnChange事件处理程序中插入如下代码:procedure TForm1.PageControl1Change(Sender: TObject);begin Panel1.Parent := PageControl1.ActivePage; /other code followsend;实际使用时,用自己的组件代替Panel1。记住:应当将组件放置在程序运行时,打开对话框时首先显示的对话页上,以避免在窗体的OnCreate事件处理程序中编写代码。L 取消拖动操作在设计窗体时,如果在移动一个组件的位置时,发现选错了组件,这时该怎么办呢?无疑,你想取消这一步的拖动操作,其实很简单,在没有释放鼠标键之前,按键,这个组件就会返回到原来的位置。M 为Y2K格式化tDateTimePickers的日期显示在Delphi中使用TDateTimePicker.DateFormat来指明日期格式,DateFormat是TDTDateFormat类型属性,取值为dfShort或dfLong。若取dfShort, 日期格式类似于是“3/21/97”;若取dfLong, 日期格式类似于“Friday, March 21, 1997”。为了兼容Y2K格式,需将日期格式设置为YYYY-MM-DD,根据上面的解释,tDateTimePicker组件在设置为短日期格式时就不敷应用了。但是, 如果你在控制面板中设置了短格日期式(使用区域设置),tDateTimePicker将使用Windows的设置,所以它还是可以使用的。DELPHI编程技巧集锦(2)董占山(中国农科院棉花研究所,河南安阳,455112)三、代码设计的相关技巧A 使用特殊字符应用程序有时需要用到键盘上没有的字符,例如,版权符号(©)、英镑符()和日圆符(¥)等。为了输入这些字符,需要使用Windows字模映射程序。打开字模映射程序,从“字体”列表框中选中合适的字体,在下面的列表框选中一个字符,在窗口的右下角将显示出这个字符的ASCII码值。例如英镑符的ASCII码为0163,在键盘上按下键的同时按下0163,就可以输入英镑符。也可以使用字模映射程序的选择和复制按钮将选定字符复制到Windows的剪贴板上,然后再使用“粘贴”命令或按键盘命令将字符粘贴到目标程序代码中。B 在代码中设置位置标记Delphi代码编辑器允许在源代码中放置一些位置标记,就向老式的WordStar所具有的那种。使用位置标记的目的是快速地在文档不同位置之间进行切换。比如在创建一个类函数时,希望看一下它的声明部分,位置标记就派上用场了。在代码编辑器中设定位置标记的快捷键为:+,移动到已有位置标记的快捷键为: + 。在默认状态下,Delphi并不保存用户在代码中设定的位置标记,为了让Delphi将设定的位置标记保存到文件中,一便下次利用,需要在“Environment Options”对话窗口的“Preferences”对话页选中“Autosave”复选项,这样Delphi就将位置标记信息保存到项目的DSK文件中。C 使用键盘快捷键快速进行代码块缩进在编辑程序源代码时,不同代码块之间保持不同的缩进距离,可以使代码易于阅读。当程序结构调整之后,需要调整代码的缩进量,通常我们使用上下光标键在不同代码行之间进行切换,用、和键来增加或减少缩进空间。使用过Turbo Pascal的老用户可能还记得它的集成编辑器提供了一组快捷键来快速切换代码块的缩进量,使用十分方便。其实,Delphi集成编辑器也提供了两个组合键来快速增加或减少多行代码的缩进量。首先选择待改变缩进量的代码块,按组合键来扩展代码块的缩进量,按组合键来缩小代码块的缩进量。D 在代码编辑窗口中选择一个矩形区域大家知道在Microsoft Word 97中可以选择一个矩形区域,在Delphi的集成编辑器也有类似功能。为了选择一个矩形区域,按下键不放,然后用鼠标和键盘选择文本。E 跳到VCL源代码去通过下面的方法,可以转跳到VCL库例程的源代码:按下键;将鼠标光标移到想看其源码的类型声明的名字上;单击之即可调出VCL源程序代码进行查看。F 在集成环境中记录击键并回放在使用Delphi编写程序时,由于需要多次输入同一个变量名称或一段固定的代码,你或许想过将这段代码的击键记录下来,在需要时回放它们,以实现快速编码,减少无效劳动,就象在DOS时代使用F3键回放刚刚输入的一行命令一样。Delphi集成编辑器同样提供这项功能:按开始录制击键,然后键入你希望录制的击键,再按停止录制。按回放刚刚录制的击键。注意:这种功能仅仅在默认的编辑器键盘模式下有效。为了查找你使用了那种编辑器键盘模式,单击“Tools”*“Environment Options”菜单项,单击“Editor”标签,就可以在编辑器设置组合框中看到当前使用的编辑器键盘模式了。G 代码模板Delphi的代码模板(Code Template)可以减少重复输入。在Delphi编辑器中,按键打开模板选择列表框;或者键入一个模板的名称,然后按来扩展模板。选择“Tools”*“Environment Options”菜单命令,单击“Code Insight”标签,可以添加自己的代码模板。用户可以输入任何代码,不仅仅是数组、循环等。模板在下列情况下十分有用:为过程、函数和方法所写的标准初始化代码、注释块或其他用途。H 使用代码完成功能Delphi 3/4中一项易被忽视的功能是代码完成特征,该项功能弹出一个列表框,列出所有可能的赋值。下面的例子演示了这项功能。开始一个新的项目,双击窗体,切换到代码窗口,编写窗体的OnCreate事件处理程序,如下:procedure TForm1.FormCreate(Sender: TObject);var temp : string; temp2 : integer;beginend;这时,在过程体中输入“temp :=”,按键,稍侯,就可以看到一个含有一些变量、方法和对象的列表,以及潜在的有效赋值。一些选择项后带有省略号,表明这些对象或记录含有兼容的方法或字段可以作为赋值。四、数据库程序设计技巧A 充分利用数据库窗体专家(Database Form Expert)数据库窗体专家(Database Form Expert),在Delphi 3中称为向导,对所有版本的Delphi都是有效的。窗体专家的用途是帮助用户快速地创建数据库应用程序。但是,不足的是它产生的窗体存在控制和字段位置、大小不适中的问题。但是,其优点还是很显然的。很明显,程序员需要和客户一起来设计窗体,使其更加美观实用。数据库窗体专家可以建立数据存取控件并完成他们的基本连接属性。虽然位置和大小不适中,它可以建立大多数数据输入字段和其标签,所以充分利用数据库窗体专家,可以节省设计窗体原型的时间。B 将数据库转换为CSV格式如果想将数据库表格转换为以逗号分割的文本文件(CSV格式),可以使用如下的过程代码:procedure BackupTableToCSV(tableName:TTable);var i,j: integer; (*i-field, j-record*) s: string; (*Record string*) theStringList: TStringList; (*temp storage*)begin s:=; theStringList:=TStringList.Create; with tableName do begin try Active:=True; exceptshowmessage(不能激活数据库:+ Name); end; for j:=0 to (RecordCount-1) do begin s:=; for i:=1 to (FieldCount-1) do begin (*add next field w/comma delimiter*) s:=s+(Fieldsi.AsString)+,; end; (*i for*) theStringList.add(s); Next; end; (*j for*) theStringList.savetofile(Name+.csv); (*memo1.lines.*) Showmessage(Name+ 已被转换完毕.); close; end; (*with*)end; (*BackupTableToCSV*)C 动态更新DBGrid的行颜色DBGrid是显示表格数据的好控件,本例旨在演示如何动态地改变其中的文本颜色。例如,我们想用DBGrid中的行来显示国家的信息,如果国家的人口大于2亿,数据行显示将为兰色。在 DBGrid组件的OnDrawColumnCell事件处理程序中测试数据并改变颜色,程序代码如下:procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);begin if Table1.FieldByName(Population).AsInteger 20000000 then DBGrid1.Canvas.Font.Color := clBlue; DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);end;这是一项简单实用的技术,它除了可以显示数据内容,还可以显示信息的意义,例如太多人口、账号透支、零件到货等。D 在程序运行时创建报告使用Quick Report提供的QRCreateList函数,可以在运行时建立报告。下面是一个实例:QRCreateList(aReport, Self, qryCountry, Country Report, FieldList);其中,aReport为报告的名称;qryCountry为数据表名称;Country Report为报告题目;FieldList为包含在报告中的字段列表,如果这个列表等于nil或包含0个项目,所有字段都将被使用。在运行时建立一个报告的代码如下: 默认的字段列表为nil FieldList := nil; 确保新报告对象指向nil, 否则使用QRCreateList函数建立报告时,将出错 aReport := nil; 调用QRCreateList函数建立报告,将自动建立一个含有列头带和细目带的报告, 用户可以在预览或打印前,添加组带、汇总带等内容 QRCreateList(aReport, Self, qryCountry, Country Report, FieldList);E 巧用字段编辑器字段编辑器(Fields Editor)除了可以建立永久的字段对象外,还可以帮助程序员迅速将数据库控件放置到窗体上。方法如下:从字段编辑器将一个字段名拖放到窗体上,当你松开鼠标键时,Delphi就向窗体上添加一个TLabel和一个TDBEdit 控件。这些被建立的控件使用在字段编辑器中设定的属性:包括Alignment、DisplayLabel、DisplayWidth和 EditMask属性。当然,DBEdit的DataSource和DataField属性也被设置好了。F 加速数据库的搜索过程想增加数据库的检索速度吗?在进行数据检索之前,调用数据表的DisableControls方法,将DataSet和 DataSource组件的联系断开,当检索结束时,调用数据表的EnableControls方法,重新在DataSet和 DataSource组件之间建立联系,这样就可以节省更新数据控制的时间,从而加速检索的速度。下面是一个实例:unit Unit1;.type TForm1 = class(TForm)DataSource1: TDataSource;Table1: TTable;Button1: TButton;.procedure TForm1.Button1Click(Sender: TObject);var SeekValue: string;begin Table1.DisableControls; Table1.FindKey(SeekValue); Table1.EnableControls;end;end.G 增强数据表的处理能力对使用数据表的应用程序,怎样在减少代码维护的同时增加程序的性能?使用Delphi的数据模块就可以做到这一点。方法如下:1 在程序计划中添加一个数据模块(Data Module);2 将数据表存取组件放到数据模块窗体上:为应用程序使用的每个数据表都添加一个TTable和TDataSource组件到数据模块窗体上,并正确设置它们的DatabaseName、TableName和DataSet属性。 3 在使用数据表的每个窗体上加入对数据模块单元的应用,这样就可以在这些窗体上使用数据控制组件了,将这些组件的DataSource设置为数据模块的合适的TDataSource组件。使用数据模块窗体将所有数据表都集中起来后,有以下三个优点:第一,免去了向每个窗体均添加数据表存取组件;第二,如果同一数据字段在不同的窗体中使用并修改,这样的修改在不同的窗体间是共享的,而且不需要增加任何代码;第三,由于程序减少了在不同窗体上校验同一数据表的代码,所以程序的性能达到一定的改善。DELPHI编程技巧集锦(3)董占山(中国农科院棉花研究所,河南安阳,455112)五、操作系统相关的技巧A 如何决定Windows的版本Windows具有多个版本,一个应用程序或者具有运行在多个Windows版本下的灵活性,或者通过条件编译指令,编译成只能在一个操作平台下工作。下面介绍一种方法,可以使应用程序能动态地决定Windows操作系统的版本。应用程序通过调用Windows API函数GetVersionEx可以获得Windows的版本信息,该函数使用一个TOSVersionInfo类的变参,所有Windows版本信息就包含在其中,其结构如下:typedef struct _OSVERSIONINFO DWORD dwOSVersionInfoSize; /结构的大小 DWORD dwMajorVersion; /主版本 DWORD dwMinorVersion; /副版本 DWORD dwBuildNumber; /建立版本 DWORD dwPlatformId; /操作平台标识 TCHAR szCSDVersion 128 ; /版本标识字符串 OSVERSIONINFO;下面是使用该函数的一个例子:procedure TForm1.Button1Click(Sender: TObject);var VersionInfo: TOSVersionInfo;begin VersionInfo.dwOSVersionInfoSize := Sizeof(TOSVersionInfo); GetVersionEx(VersionInfo); case VersionInfo.dwPlatformID of VER_PLATFORM_WIN32S: Do_SomeThing; VER_PLATFORM_WIN32_WINDOWS: Do_SomeOtherThing; VER_PLATFORM_WIN32_NT: Do_SomeThingElse; end;end;B 内存知多少? 下面介绍一种方法可以决定系统内存的多少、使用状态等信息。更重要的是,应用程序可以利用这项技术来决定客户机的可用内存的大小,利用这些信息,应用程序可以动态地优化程序的性能。例如,如果有足够的内存可以利用双缓存优化位图的操作。利用Windows API函数GlobalMemoryStatus可以完成上述功能。GlobalMemoryStatus接收一个类型为TMemoryStatus的变参,通过这个参数就可以获得Windows当前的内存状态。TMemoryStatus的结构如下:typedef struct _MEMORYSTATUS / mst DWORD dwLength; / sizeof(MEMORYSTATUS),该记录结构的大小 DWORD dwMemoryLoad; / 使用内存所占百分比 DWORD dwTotalPhys; / 物理内存的字节数 DWORD dwAvailPhys; / 自由物理可用内存字节数 DWORD dwTotalPageFile; / 页文件字节数 DWORD dwAvailPageFile; / 页文件的自由字节数 DWORD dwTotalVirtual; / 地址空间的用户字节数 DWORD dwAvailVirtual; / 自由用户字节数 MEMORYSTATUS, *LPMEMORYSTATUS;下面是使用GlobalMemoryStatus函数的一个例子:procedure TForm1.Button1Click(Sender: TObject);var MemoryStatus: TMemoryStatus;begin MemoryStatus.dwLength := sizeof(MemoryStatus); GlobalMemoryStatus(MemoryStatus); Label1.Caption := Total Physical Memory: + IntToStr(MemoryStatus.dwTotalPhys);end;C 获得消逝时间在测试硬件或软件的效率时或跟踪用户的响应速度时,需要测定消逝的时间。多数程序员使用一个TDateTime变量和Now函数来实现测定消逝时间的目的。但是,一种更简单的方法是使用Windows API函数GetTickCount。GetTickCount函数返回从启动Windows后消逝的毫秒数。如果函数成功地返回,返回值就是从启动Windows后消逝的毫秒数。下面是一个使用实例:procedure TForm1.Button1Click(Sender: TObject);var i: longint; StartTime, EndTime: Double;const CLOCK_TICK: Double = 1000;begin i := 0; StartTime := GetTickCount; while (i 10000000) do i:= i+1; EndTime := GetTickCount - StartTime; ShowMessage(Format(消逝时间: %0.2f 秒,EndTime/CLOCK_TICK);end;D 隐藏/显示Windows 95的任务栏想不想让你编写的Delphi程序具有隐藏/显示Windows 95任务栏的功能,在程序中使用下面的两个过程就可以实现这一功能。procedure hideTaskbar;var wndHandle : THandle;wndClass : array0.50 of Char;begin StrPCopy(wndClass0, Shell_TrayWnd); wndHandle := FindWindow(wndClass0, nil); / 隐藏任务栏 ShowWindow(wndHandle, SW_HIDE); end;procedure showTaskbar;var wndHandle : THandle;wndClass : array0.50 of Char;begin StrPCopy(wndClass0, Shell_TrayWnd); wndHandle := FindWindow(wndClass0, nil); / 显示任务栏 ShowWindow(wndHandle, SW_RESTORE); end; E 捕获文件的日期和时间标志希望显示文件的日期和时间标志吗?Delphi中没有一个简单的函数来完成这项功能,但是我们可以将两个函数结合起来实现这一功能。首先,FileGetDate函数返回文件的DOS日期和时间,然后,FileDateToDateTime函数将日期和时间转换为TDateTime类型的变量,最后,DateTimeToStr过程将TDateTime类型的变量转换为字符串。实例如下:procedure TForm1.Button1var TheFileDate: string; Fhandle: integer;begin FHandle := FileOpen(YourFileName, 0); tryTheFileDate := DateTimeToStr(FileDateToDateTime(FileGetDate(FHandle); finallyFileClose(FHandle); end;end;使用DateTimeToStr的格式化参数可以调整输出结果的形式。即使你不需要显示日期和时间,也可以使用这项技术比较和计算文件日期。F 避免驱动器A没有准备好错误(Not Ready error)当你的程序存取A驱动器时,可能会被Drive Not Ready系统错误所中断,可以使用下面的函数来测试驱动器,以避免这种情况发生,代码如下:function DiskInDrive(Drive: Char): Boolean;var ErrorMode: word;begin Drive: = UpCase(Drive); if not (Drive in A.Z) then raise EConvertError.Create(Not a valid drive ID); ErrorMode := SetErrorMode(SEM_FailCriticalErrors); try if DiskSize(Ord(Drive) - $40) = -1 then DiskInDrive := False else DiskInDrive := True; finally SetErrorMode(ErrorMode); end;end;本函数的工作原理是:首先将驱动器符转换为大写字母,然后关闭系统错误报告功能,执行磁盘操作,操作成功返回True,表明驱动器里存在磁盘;操作失败返回False,表明发生错误,函数结束时打开系统错误报告功能。G 隐藏应用程序假如你不仅想让应用程序隐藏窗体,同时不想让应用程序在任务栏上显示,可以使用如下命令: ShowWindow (Application.handle, SW_HIDE);这条命令对使用托盘区(System Tray)图标来激活的应用程序十分有用。H 重定向DOS应用程序有时,你需要重定向一个DOS应用程序。下面的代码可以帮助你完成这项工作:-CreateDOSProcessRedirected- Description : executes a (DOS!) app defined in the CommandLine parameter redirected to take input from InputFile and give output to OutputFile Result : True on success Parameters : CommandLine : the command line for the app, including its full path InputFile : the ascii file where fro

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论