版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 DELPHI 中MEMO 组件的光标定位作为一个与VisualBasic 相类似,但功能更强大的可视化程序开发工具,Delphi 同样提供了大量的简单便捷的控制组件,通过这些组件,程序设计者可以设计出规范美观的界面。并且规范化使用者的输入内容。其中,Delphi 提供的编辑组件中的Memo 组件的功能是非常丰富的。它可以完成对文字的编辑、修改、文件的调入和存储文件等功能,但是与一般的字处理软件相比,它并未提供编辑时对光标位置、所在行及所在列的信息,这不能说不是一个缺憾。其实,通过很简单的几行程序就可以实现这一要求:先在Form 上放置三个Label 组件,并在程序代码的前面声明下面这三个变量
2、为整型数,即:VarLpos ,Cpos ,Linelength :integer ;其中Lpos 是行的值(按照Memo 的规定,第一行为0 ,Cpos 是字符的位置,LineLength 是当前行的字符总个数。然后,再将下面的七行程序代码分别加入Memo1的OnMouseDown 和OnKeyDown 的事件代码处即可。Lops :=SendMessage(memol.Handle,EM LINEFROMCHAR ,Memol.SelStart ,0 ;Cpos :=SendMessage(meno1Handle ,EM LINEINDEX ,Lpos ,0 ;LineLength :=S
3、endMessage(memol.handle,EM LINELENGTH ,Cpos ,0 ;Cpos :=Memol.SelStartCPos ;Labell.caption :=inttostr(lpos;Label2caption :=inttostr(cpos;Label3caption :=inttostr(linelength;这样,执行程序后,随着在Memo 组件中的编辑操作,Label1、Label2和Label3就将显示出相对应的当前行值、字符位置与当前行的字符总个数了。DELPHI 中CHARTFX 构件使用详解Delphi 是一种新型可视化程序开发工具。它在功能上远远胜
4、过VB ,甚至被冠以VB 杀手(VBKiller的美誉。理由之一就是Delphi 可以轻松地安装和使用VB 的VBX 控件并转换VB 程序为Delphi 程序。本文将就Delphi 组件VBX 页里ChartFx(图表 构件的特性和使用方法作一较为完备的阐述。相信对读者建立美观的图表有所裨益,并会对Delphi 的“属性管理”有更深一步的认识。首先介绍一下工程上经常用到的直方图和饼图的概念。由于实际需要,常需比较一组数据或多组数据的相对大小(如公司中各部门的收支情况比较、金融利率的调整情况等 。为了能够简洁直观地得到比较结果,通常将这些数据放入直角坐标系,以纵坐标的相对大小比较数据,即所谓直方
5、图;或是将各数据转化为百分点,放入一个单位圆,即形成所谓饼图。在Delphi 组件VBX 页中,ChartFx 构件就是以上工程需要而设计的。选取该构件置于窗体上,调整至合适大小,即可见到缺省的图表格式(在未初始化数据时,构件自动生成随机数据充当比较项目 。在对象监视器中,设置不同的属性,还可以看到其它工具条。以下逐条解释各属性:Nseries 需比较的数据项的个数。Nvalues 每个数据项中的子项目数。TitleDlg 图表的标题设置对话框。AdmDlg 图表构件绘图区上下左右边缘处注解设置对话框。FontDlg 注解文字字体设置。BorderStyle 图表构件的边框风格。Height
6、、Width 、Top 、Left 这四项设置图表构件在窗体中的位置及大小。BottomGap 、TopGap 、LeftGap 、RightGap 这四项设置图表构件绘图区的位置及大小。ChartType 、pThpe 、Style 这三项设置图表构件及绘图区的类型与风格。Chart3D 用以设置是否以三维形式显示数据。ViewRot3D 设置观察三维图示的视角。WallWidth 设置三维图示中X 、Y 、Z 三壁的厚度。LinebkColor 、LineColor 、LineStyle 、LineWidth 设置线条的颜色和风格。PointType 设置数据点的形状、类型。RGB3DBK
7、 、RGB2DBK 、RGBBK 、RGBBarHorz 设置2/3维图示中背景色。Cursor 设置绘图区光标形状。Decimals 设置图表中数据显示的小数位数。Stacked 设置图表中数据的归一化方式。Grid 、VertGridGap 设置坐标系的背景网格线。在制作同时比较多组数据的图表时,还需要设置以下属性:。 FixedGap 每个数据项之间间隔。ThisPoint 数据项的次序。ThisSerie 每个数据项中子数据项的次序。ThisBkColor 、ThisColor 颜色设置。余下的Visible 、Hint 、HelpContext 、Name 、Tag 等属性与其它构件
8、相同,不再赘述。下面对CustTool 、ToolBar 、PalleteBar 、PatternBar 几个关于图表中工具条设置的属性作简单介绍。PalleteBar 设为True 时生成的图表带有颜色设置工具条,即可在浏览图表时改变数据项颜色以适应不同视觉需求。PatternBar 设为True 时生成的图表带有图案设置工具条,作用同上。 ToolBar 设为True 时生成的图表带有一个功能强大的工具条,其上加速键能完成的功能有:从数据文件读入比较数据、输出数据到数据文件、图表打印、在直方图/饼图/离散点图/曲线拟合图之间切换、2/3维切换、改变视角、以表格方式浏览、修改数据等等。丰富的
9、功能节省了程序员的开发时间,使用极为方便(工具条上每个加速键都有Hint 提示 。CustTool 在该属性里可以设置需要使用的功能项,Delphi 自动去除未选取的加速键。到目前为止,读者对ChartFx 构件的属性已有了一定的了解,可以设计较为复杂的图表了,但还不能真正制作实用的图表,因为我们还未介绍如何初始化数据。同时读者可能还发现了这么个问题:当数据较多以致构件空间容纳不下怎么办? 我们举一实例来说明这两个问题。假定某校要比较全校40个班级某一学期班平均成绩,40个班的平均分和名称(实验班、初一(2等 分别存放在两个数组Data 39、ClassName 39中。在窗体FormCrea
10、t 事件中加入以下代码:Fori:=0to39DoBeginChartFx1OpenData COD-VALUES :=makelong(1,40;WithChartFx1DoBeginThisSerie:=0;Value i :=Datai ;Legend i :=ClassNamei ;CloseData COD-VALUES :=0;End;End;按F9执行,我们发现图表并未显示全部40个数据,而是在绘图区下方出现了滚行条,滚动此条就可以浏览全部数据,Delphi 轻松地解决了这个问题。在绘图区的右方则出现了一个注解框,显示每个数据项编号所对应的班级名称。若设置ChartType 为B
11、ar ,则每个数据项都用一个有一定高度(此高度由初始化数据及归一化方式决定 的彩色矩形条来表示。用鼠标双击矩形条即显示对应数据,显示方式由DblClkDlg 和RigClkDlg 设定。现在,整个图表的建立已全部完成。只需稍动脑筋,我们即可将前述内容集成到一个函数体DLL 中,从而可以建立一个通用的图表程序。调用时只需将数据传入即可。在Delphi 中实现不同风格的SPEED 和BUTTON在许多常用的软件(如WORD 中经常会遇到这样的快捷按钮(SPEEDBUTTON:若干个按钮做为一组来工作,同一时刻只能有一个按钮处于按下状态,比如WORD 中的四个段落排版按钮。在Delphi 中实现这样
12、的功能只需要简单的一个步骤:设置若干个SPEEDBUTTON 按钮的GROUPINDEX 属性设置为同一个大于0的整数。还有另外一种快捷按钮,我们称之为开关按钮,比如WORD 中的“粗体”按钮,这种按钮每按一次状态就改变一次。在Delphi 中实现这种按钮只需要两步设置:首先设置按钮的GROUPINDEX 属性为一个大于0的整数,第二步设置ALLOWALLUP 属性为TRUE 。这样就完成了开关按钮的建立。制作可移动的分割窗体以下是实现一个简单分割(SPLITTER窗体的步骤:1 在窗体中放置一个MEMO 控件并设置它的Align 属性为ALTOP ;2 在窗体中放置一个PANEL 控件并设置
13、它的Align 属性为ALTOP ;3 设置PANEL 控件的HEIGHT 属性为6;4 设置PANEL 控件的DragMode 属性为dmAutomatic. ;5 设置PANEL 控件的DragCursor 属性为crVSplit. ;6 设置PANEL 控件的Cursor 属性为crVSplit ;7 在窗体中再放置另一个MEMO 控件并设置它的Align 属性为ALCLIENT ;8 最后为两个MEMO 控件的OnDragOver 事件添加相同的代码:procedureTForm1Memo1DragOver(Sender,Source :TObject ;X , Y :Integer
14、;State :TDragState ;varAccept :Boolean ;beginAccept :=False;ifSource=Panel1thenbeginAccept :=True;Memo1Height :=Y(SenderasTControl.Top;end ;end ;在Delphi 中实现类似VB 中的控件数组你可以通过设置一组相应控件的TAG 属性来实现这一功能。首先在窗体中放置3个BUTTON 控件,然后分别设置这三个控件的TAG 属性为1、2、3。接下来双击任意一个按钮,在其代码部分输入如下代码:procedureTForm1Button1Click(Sender:
15、TObject ;varcap :string ;begincaseTButton(sender.Tagof1:ShowMessage(1stButtonPressed ;2:ShowMessage(2ndButtonPressed ;3:ShowMessage(3rdButtonPressed ;end ;end ;最后在其他两个按钮的ONCLICK 事件中选择已经编好的代码。这样一来就可以实现以上功能了。丰富多彩的标签我们已经不满足于Delphi 提供的简单的标签,能不能在标签中有不同的字体,有不同的颜色,以此来丰富我们的表现能力。回答是肯定的,并且用不着第三方提供的控件,我们只要巧妙的利
16、用Delphi 自己提供的TRichEdit 就可以了。首先将TRichEdit 控件的边框去除:RichEdit1BorderStyle :bsNone ;同时设置只读属性为真:RichEdit1ReadOnly :=True;然后,你利用write 之类的软件制作好RichText 格式的文本,通过以下语句就可以显示出来了:RichEdit1PlainText :=False;RichEdit1Lines.LoadFromFile(c :test.rtf ;DELPHI 构件制作方法Delphi 作为RAD 工具,以其快速编译和友好的可视化界面受到广泛欢迎。Delphi 提供了很多现成构件
17、,而且随着版本更新不断增加新构件。另外还可以买到第三方开发的特色构件,或从因特网下载免费构件。这些构件足以支持一般应用系统开发。但应用开发人员仍有必要自己制作构件。采用构件形式可以把对象严密封装,并加上一层直观外壳,有利于软件调试和代码重用。开发群体以构件为功能单位分工协作,比较容易实现工程化管理,从软件规划设计到测试修改都可以减少意外差错,大大提高工作效率。成熟的构件还可以作为商品软件出售,带来附加效益,且有利于软件开发的社会化分工协作。Delphi 的构件使用和构件制作采用同样的工作环境和相似的编程方法,只要弄清基本原理,制作构件无需学习多少新东西。基本概念制作构件的基本过程可以概括为:1
18、编写构件单元(unit。其中包含构件声明和构件实现代码。2按照与普通Delphi 单元同样的方法编译和调试构件单元。3创建构件注册单元。其中用uses 语句连接构件单元,并用Register 过程完成构件的注册。4编写构件联机帮助信息,并编译成标准Windows 帮助文件。 全部工作完成后,生成构件单元二进制文件(.DCU、构件注册源文件(.PAS和帮助信息文件(.HLP及附加的关键词文件(.KWF。用户拿到这些文件后,就可以安装使用了。在Delphi 环境下调用菜单命令,启动安装过程(安装过程中需指定注册文件名 ,可以把构件注册到Delphi 的VCL 库中,并在构件工具条上生成一个新按钮。
19、借助HelpInst 安装工具可以把关键词文件并入Dephi 帮助索引系统,用F1键实现联机帮助。这样制作出的.DCU 文件与一般Delphi 单元没有根本区别,即使不安装到VCL 库中也可以由其他单元直接调用。最大的区别在于:构件单元中某些属性和事件声明为published ,从而在程序设计期对用户是可见的,用户可以通过对象编辑窗口(ObjectInspector访问这些属性和事件。这是可视化程序设计的关键所在。对象的继承与修改制作构件第一件事就是选择适当的Delphi 对象类型作为父对象,以派生新的对象。子对象可以继承父对象的全部非private 部件,但不能摆脱不需要的部件。因此,所选父
20、对象应尽可能多地包含子对象所需的属性、事件和方法,但不应包含子对象不需要的东西。TComponent 是所有Delphi 构件的基点,但若直接从TComponent 派生新构件,很多东西就需要自己从头做起。一般只有非可视构件才直接从TComponent 派生。Delphi 提供了若干专门用于制作控件(可视构件 的对象类型,都是从TControl 和TWinControl 派生而来。其派生关系如下:TControl TGraphicControl TCustomLabelTWinControl TCustomControl TCustomGrid TButtonControl TCustomGr
21、oupBox TScrollingWinControl TCustomPanel TCustomComboBox TCustomEdit TCustomListBoxTControl 的子类型用于非窗口式控件,TWinControl 的子类型则用于窗口式控件。除非特殊需要,一般不直接从TControl 和TWinControl 派生新控件,而是从其子类型派生。这样可以充分利用原有的属性、事件和方法,减少很多工作量。在这些构件类型中,非通用的属性、事件和方法都声明为protected 。这样可以禁止构件用户访问,又能被子类型继承和修改。在新构件中,可以简单地把继承来的属性和事件重新声明为publ
22、ished ,使构件用户能在设计期通过对象编辑窗口访问,也可以进而修改属性的默认值和读写方式,或是重载(override事件处理子过程和其他构件方法,以修改其中的程序代码。重声明可以放宽访问权限,但不能相反,例如,不可能把published 属性重声明为private 或protected 。为了增加新功能,常常需要定义全新的属性、事件和方法。定义时,一般总是把对用户开放的属性和事件声明为published ,把方法声明为public 或protected 。构件属性在构件中,属性和方法往往可以相互替代。对构件用户来说,属性比方法更直观简便。因此,只要可能,应尽量以属性取代方法。属性类型包括简
23、单类型(numeric,character ,string 、枚举类型、集合类型、对象类型(例如font 和数组类型(例如TStrings 类型中的Strings 。其定义方法如下:typeprivateFLayers :Integer ;内部存储用的变量functionGetLayers :Integer ;用来读属性值的方法procedureSetLayers(ALayers:Integer ;用来写属性值的方法 publishedpropertyLayers :IntegerreadGetLayerswriteSetLayersdefault1;end ;每个属性都需要相应的privat
24、e 变量用于内部存储。按照约定,变量名以F 打头,后跟属性名(此处为Layers ,读写方法名称分别为Get 加属性名和Set 加属性名。写方法总是带一个与属性类型相同的参数,用以传送属性值。此参数可以传值,也可以传递变量。如果不定义写方法(省略write 部分 ,此属性便成为只读属性。读写方法应该在private 部分声明,以使其对构件用户和构件的派生对象保持隐蔽。读写方法除了取值和赋值之外,还可以附加其他操作代码,使属性读写产生附加效应。这正是属性可以取代方法的原因。如果不需要附加效应,可以不定义读写方法,采用直接访问格式来声明属性:propertyLayers :IntegerreadF
25、LayerswriteFLayersdefault1;default 命令符用来指定属性的默认值,同时需要在构件的构造函数中为属性设置初值。default 命令的作用是在窗体文件存盘时提供参照:若属性当前值与default 命令指定的值不同,则把当前值保存在文件中,否则便无需保存。如果省略default 命令,属性当前值总是保存在窗体文件中。事件与事件处理过程创建构件时,事件也被当做属性来处理,区别仅在于事件必须定义为过程类型,使其成为一个隐蔽指针,指向某个潜在的过程。当构件用户为事件指定处理子程序后,事件便成为指向该子程序的指针。事件的定义方式如下:typeprivateFOnClick :
26、TNotifyEvent ;声明事件变量以保存过程指针publishedpropertyOnClick :TNotifyEventreadFOnClickwriteFOnClick ;end ;此例正是Delphi 标准控件中Click 事件的定义方式。可以看出,除了OnClick 被定义为过程类型外,其定义格式与一般属性的直接访问格式几乎完全相同。Delphi 预定义了所有标准事件的过程类型及标准事件所引发的虚方法。其中,Click 事件将引发如下虚方法:procedureTControl.Click ;beginifAssigned(OnClickthenOnClick(Self;以下是默
27、认处理部分end ;其中,Assigned 函数检验OnClick 是否已分配了事件处理过程。如果返回值为True ,则调用用户指定的事件处理过程。通过重载此虚方法,可以修改Click 事件的处理方式。在重载的方法中,一般应先调用用户处理程序,然后再安排后续处理。在本例中,首行代码应当是inheritedClick 。需要注意的是,构件用户不一定会给事件指定处理程序,因此事件不能定义为函数类型,否则可能会指向返回值类型不定的空函数。如果需要事件处理过程返回某个值,可以借助var 参数。调用用户程序之前应确保此参数包含有效返回值,以免用户未指定事件处理过程时出错。如果Delphi 标准事件不能满
28、足需要,也可以自己定义事件。其核心思想是选择适当的Windows 消息来引发构件中的事件过程。篇幅所限,不拟详述,请读者参阅有关资料。方法处理要点方法处理在创建构件时和使用构件时没有多大区别,但有些问题仍需要注意。首先要注意的是,构件通常是在事件处理过程中调用,而构件作者又无法预测用户将在什么环境下如何调用构件。因此,构件中的方法应尽量避免占用系统资源,避免使Windows 停止对用户操作的反应。创建构件时应随时意识到,此构件不仅可以直接调用,而且可用来创建别的构件。即使是对用户隐蔽的方法也应具有完整的功能和清晰的接口。除了属性读写方法之外,内部方法一般应声明为protected 虚方法,以便
29、被派生对象继承和重载。属性读写方法则应采用private 声明严密保护。派生对象如果需要读写父对象的属性值,应该访问属性本身,没有必要直接访问其读写方法。构件测试制作构件的核心工作是编写构件单元,包括根据构件功能要求设定对用户开放的属性、事件和方法,设定用以实现这些部件的变量、过程和函数等等。除了属性和事件有特殊格式之外,构件单元的设计方式与一般Delphi 单元没有什么不同,只是单元中不能包含窗体。在编写构件单元的过程中,可以借助一个测试窗体直接对其测试。以可视化方法在窗体上安排构件,本质上不过是自动生成调用构件的代码。即使构件未并入VCL 库,无法使用可视化操作,也可以手工编写这些调用代码
30、。这样测试,可以免去反复修改而导致的反复安装。测试时,需先建立一个窗体单元,然后进行以下操作:1把被测构件单元名称加入窗体单元的uses 语句中,并在public 部分声明被测构件的对象实例。2在窗体单元的FormCreate 子程序中调用被测构件的Create 方法,以构造构件实例,其Owner 参数设置为Self ,即窗体本身。然后给Parent 属性赋值,并适当设置其他属性值。Parent 是容纳构件的父对象,如果是窗体本身,应设置为Self 。3运行包含测试窗体的工程,找出构件程序中的错误。注册构件注册构件用的程序代码可以放在构件单元中,但在Delphi 下注册构件时要求提供包含注册代
31、码的源程序文件(.PAS文件 ,因此,比较好的方式是把构件核心代码编译成.DCU 文件或.DLL 动态链接库,在注册源文件中只放注册代码和外围程序。下面是注册代码实例:typeTMyPanel class(TCustomPanelTMyLabel class(TCustomLabelprocedureRegister ;implementationprocedureRegister ;beginRegisterComponents(Samples ,TMyPanel ,TMyLabel ; end ;注册过程名必须是Register 。过程体中调用RegisterCompnents ,其中的两
32、个参数分别指定Delphi 构件工具条页名和要注册的构件类型。如果指定页不存在,Delphi 将创建一个新页。Delphi 环境提供了一个构件生成器(componentexpert,可用来自动生成注册单元。构件工具条上每个构件需要一个24×24点阵bitmap 图标。图标可以借助Delphi 的ImageEditor 编辑生成,以.DCR 资源文件的形式提供给构件用户,文件与注册单元文件相同。如果不提供此文件,Delphi 将采用默认图标。提供联机帮助一个成熟的构件,无论是用于开发群体还是用做商品软件,都要有联机帮助信息才能正常使用。Delphi 的帮助信息与Windows 一般帮助
33、信息结构基本上相同,其编写方法可参见有关资料。但Delphi 包含一个特殊的帮助搜索引擎,能跨越多个帮助文件搜索关键词。因此,在构件帮助文件中不仅要有普通K 型关键词脚注,还要包含Delphi 所用的B 型关键词脚注。脚注内容有如下约定:在Delphi 的对象编辑窗口和代码编辑窗口中,用F1键可以引发帮助搜索引擎,通过B 型关键词调出有关帮助主题。为了实现这种帮助机制,需借助KeywordGenerate 程序来生成关键词文件(.KWF,与帮助信息文件(.HLP一起交给构件用户。用户借助HelpInst 程序把关键词文件内容并入Delphi 主帮助索引文件(.HDX中。构件联机帮助信息应当与D
34、elphi 标准构件帮助信息格式相同。编写帮助文件时最好遵循如下约定:1每个构件有一个单独的帮助主题(Topic,内容包含构件简介及用户可见的属性、事件和方法列表。2新增的及修改较大的属性、事件和方法均应有单独的帮助主题,其中应包含所属构件、用途、声明格式等内容。3每个帮助主题都应包含K 型脚注,以便用F1键引发。让字体左、右对齐做文字编辑器时少不了对字体的各种操作,而TRichEdit 控件是必不可少的。最基本的就是文本的靠齐方式了,需要对文本进行左靠齐、右靠齐、中间靠齐时就可以利用以下语句了:左靠齐RichEdit1Paragraph.Alignment:=taLeftJustify;中间
35、对齐RichEdit1Paragraph.Alignment:=taCenter;右靠齐RichEdit1Paragraph.Alignment:=taRightJustify定制Speedbar在Delphi 的可视化设计界面中,使用最频繁的地方要数位于屏幕左上角的加速按钮栏(Speedbar了。在实践过程中,笔者无意中发现了Speedbar 的定制方法,这在我用过的四本Delphi 参考书中均未提及到。步骤如下:右键点击Speedbar ,在弹出菜单中选Properties ,这时会出现一个名为SpeedbarEditor 的对话框。假设想要增设一项“语法检查”的功能,可在左边Catego
36、ries 列表框中选Project ,再把右侧的SyntaxCheck 图标拖放到Speedbar 的合适的位置上,这项功能就已经加上了。如果speedbar 上没有多余的空间来容纳新的按钮,可将鼠标停在speedbar 右框处,变为双向箭头的形状时,向右拖动一段距离,就可腾出空间。如想删除speedbar 上的某个按钮,可简单地把它拖出speedbar 的范围,就能删除。操作十分方便。建议把SyntaxCheck 、ProjectOptions(工程选项 、WindowsApiHelp 加到Speedbar 中,可以提高开发效率。在DBGRID 中实现COPY 、PASTE 功能工具条上的C
37、ut 、Copy 和Paste 加速按钮,对于使用Windows 下编辑器的人来说,恐怕都是非常熟悉而且不可缺少的。Delphi(10和20版 中的有些控件,如:TDBEdit 、TDBImage 、TDBMemo 、TEdit 等,具有CutToClipboard 、CopyToClipboard 和PasteFromClipboard 方法,在这些控件上,利用这几个方法,只要通过简单的编程,就可以实现上述加速按钮。但TDBGrid 控件却不提供上述方法,无法直接实现这几种功能。而在单机的数据库应用程序中,TDBGrid 却经常被用来进行数据(包括数字和文字 的输入,没有Copy 和Past
38、e 功能,使用起来深感不便。笔者在编程过程中,利用中间控件进行“过渡”,间接地实现了这几种功能。主要思路:既然TDBGrid 控件无法直接实现Copy 和Paste 编辑功能,则可以将TDBGrid 控件中需要进行这几种编辑的字段(Field的内容,转移到具备这几种功能的控件(以TDBEdit 为例 中去,编辑完毕后,再传回到TDBGrid 中。具体方法:在已设计好的包含有TDBGrid 控件(设名为DBGrid1 的窗体中,增加一个TDBEdit(设名为DBEdit1 控件,其DataSources 属性设为与DBGrid1的DataSources 属性相同,对DBGrid1控件的OnCol
39、Enter 事件编程,使DBEdit1的DataField 属性值等于DBGrid1控件的被选择字段的字段名。再在窗体中增加两个快速按钮:Copy 和Paste ,图形可选Delphi 子目录下Images Buttons 子目录里的Copy.bmp 和Paste.bmp 。对Copy 快速按钮的OnClick 事件编程:DBEdit1CopyToClipboard ;对Paste 快速按钮的OnClick 事件编程:DBEdit1PasteFromClipboard ;DBGrid1SelectedField.AsString :=DBEdit1Text ;此时,如果DBGrid1中的某一单
40、元Cell 数字需要粘贴另一单元Cell2的部分或全部内容,用鼠标单击选择Cell2,此时DBEdit1所显示的内容与Cell2的内容相同。在DBEdit1中用鼠标拖曳选择部分或全部内容,单击Copy 快速按钮;再用鼠标单击选择Cell ,此时DBEdit1所显示的内容与Cell 相同,在DBEdit 中欲粘贴刚才所选内容的位置插入光标,单击Paste 快速按钮,则刚才所选内容插入到光标位置,Cell 的内容也随之改变成插入后的内容,由此完成了一次Copy Paste 操作。用这种方法实现Copy Paste 操作,比正常的操作多了一次鼠标的键击、两次鼠标的移动。在重复输入的内容不多,且操作者
41、键盘输入很快很熟练的情况下,这种实现Copy Paste 的方法,意义似乎不大。但如果应用程序的使用者是那些并没有掌握某种快速文字输入技巧、很有可能还在使用拼音输入法的人,如果使用者对正常的Copy Paste 方法本来就不熟练(则感觉不到这种方法的不合常规 ,且又非常地善于在一长串的同音字里翻来翻去地寻找的话,这还是一种不错的方法。如果哪位读者有能在TDBGrid 中实现常规Copy Paste 操作的方法,请不吝赐教。以下是有关的程序代码:procedureTUnitDetail.DBGrid1ColEnter(Sender:TObject ;begincaseDBGrid1Selecte
42、dIndexof0:DBEdit1DataField :=UnitNum ;1:DBEdit1DataField :=UnitName ;2:DBEdit1DataField :=Header ;3:DBEdit1DataField :=Address ;4:DBEdit1DataField :=Tel ;end ;end ;procedureTUnitDetail.SBCopyClick(Sender:TObject ;beginDBEdit1CopyToClipboard ;end ;procedureTUnitDetail.SBPasteClick(Sender:TObject ;beg
43、inDBEdit1PasteFromClipboard ;DBGrid1SelectedField.AsString :=DBEdit1text ;end ;用QUICKREPORTFORDELPHI 制作报表uickReportforDelphi 是Delphi 中由QuSoft 公司开发的一套用于制作报表的构件组。使用它们可以制作一些相当复杂的报表,并且可以为你的报表加入各式各样的页眉、页脚、标题、水印、表格线等. 制作一个简单的报表在这一步,我们先看看如何制作一个仅包含有列标题和数据内容的报表(如表1 :1建立一个新的Form ;字体设置为宋体五号,PrintScale 属性设置为Fal
44、se ;2在该Form 上放入两个QuickReport 组中的TQRBand 构件Band1,BandDetail ;将其type 属性设置为rbColumnHeading ,rbDetail ;3放入一个TTtable 构件Table1,设置其DataBase 属性为DBDemos ,TableName 属性为Custermer ,Active 属性为Ture ,再放入一个TDataSource 构件DataSourcel ,设置DataSet 属性为Table1;4在Band1上加入三个TQRLabel 构件,将其Caption 属性值分别设为“公司名称”、“电话”、“传真”;在Band
45、Detail 中加入三个TQRDBText 构件,将其DataSource 属性设为DataSourcel ;DataField 属性分别设为Company ,Phone ,Fax ;5加入一个QuickReport 构件Report1,用右键单击,并选择Preview 项,可预览报表,此时你可发现该报表仅显示当前一条记录,将TQuickReport 构件DataSource 属性设为DataSource1,再进行预览就可看到所有的记录均显示在报表中;6至此报表已基本完成,可在程序中加入Form1Report1Priview ;对该报表进行预览,加入Form1Report1Print ;打印该
46、报表。. 制作带有主从关系的复杂报表1加入一个新的TTable 构件Table2,设置其DataBase 属性值为DBDemos ,TableName 为Orders ,Active 为Ture ,设置MaserSource 为DataSource1,建立主从关系为CustNo ;增加DataSource2,设置其DataSet 属性值为Table2;2增加一个TQRBand 构件Band3,设置其Type 为rbSubDetail ;3在Band3中增加两个TQRLabel 构件,设置其Caption 分别为“订单编号”、“金额”;相应在该TQRLabel 构件后增加两个TQRDBText
47、构件,设置其DataSource 属性为Datasource2,DataField 属性分别为Order ,AmountPaid ;4增加一个TQRDetailLink 构件QRDetailLink1,设置DataSource 属性值为DataSource2,设置Master 属性为Report1,DetailBand 为Band3;5主从关系报表即可完成,形式表2。. 给报表增加页眉和页脚为了美观和方便,我们常希望能在报表每页的页眉或页脚中打印出页码、总页数、打印日期等等。在QuickReport 中也提供了简便的方法:1在该Form 中再增加一个TQRBand 构件Band4,将其Type
48、 属性设置为rbPageHeader ,即可将Band4中的内容作为页眉打印出来;2在Band4中加入TQRLabel 构件,以在报表中每页显示文字;加入TQRSYSdata 构件,设置其Data 属性值,可在报表中显示页码、打印日期、打印时间、记录序号等等文档信息;3如希望在每页中显示总页数,则必须写入下面几行程序:Report1Prepare ;Count :=QRPrinter.PageCount;QRLabell.Caption :=InttoStr(Conut;Report1Cleanup ;Report1Preview ;. 为报表增加标题和封面我们希望在第一页上加上标题或给报表加
49、上封面,在使用QuickReport 制作报表时,也是很简单的。在报表中增加一个TQRBand 构件,将其属性设为rbTitle ,在Band5中所加的文字和图形,均在第一页中打印出来。当用于封面时,可在该Band 的AfterPrint 事件中加入Report1NewPage ,即可。. 为报表增加表格线可以使报表看起来更为清晰明朗。在QuickReport 中提供了两种方法:一是使用TQuickReport 和TQRBand 构件的Frame 属性;二是直接使用TQRSharp 构件。使用TQuickReport 和TQRBand 构件的Frame 属性的优点是设置简单,不需要写程序代码;
50、缺点就是不能随意修改其位置和大小。使用TQRSharp 则恰恰相反。而且在其所属Band 的AfterPrint 事件中可自由修改其位置、线型、粗细等参数。. 制作一个自己的Priview 窗口QuickReport 提供了一个缺省的Preview 窗口,在TQuickReport 构件上单击右键选择Preview 显示报表时使用的也是该Preview 窗口。但由于该Preview 窗口是英文版,当我们需要显示的是中文时,就需要制作一个自己的Preview 窗口,其方法简单叙述如下:1建一个新Form :Form2;2在其上加入一个TQRPreview 构件;3增加几个Tbutton 构件,使
51、用其OnClick 事件调用该TQRPreview 构件的ZoomtoFit 方法,ZoomToWidth 方法或修改PageNumber 和Zoom 属性值即可自由调整TQRPreview构件中所显示报表的显示状态;4为了能在程序中调用Preview 方法时显示的是自己的Preview 屏幕,还须在程序的主单元中写入下面的代码:QRPrinter.OnPreview :=OnPreview;ProcedureTMyMainForm.OnPreview ;beginForm2ShowModal ;end ;5至此你便拥有了自己的Preview 屏幕。值得注意的是此屏幕只能在程序执行的过程中显示
52、。综上所述,使用QuickReportforDelphi 制作报表主要是通过将包含打印内容的构件TQRLabel 、TQRDBText 、TQRCacl 、TQRSysData 、TQRSharpTQRMemo 等等放置在相应的TQRBand 上,并设置TQRBand 构件的Type 属性以确定该Band 打印位置,从而实现页眉、页脚、标题、水印、表格线等报表的特殊效果,并可使用TQRDetailLink 、TQRGroup 等辅助构件给Band 间建立连接关系及对数据内容进行分组,以实现明细表、数据分类等特殊的报表要求。快速动态创建MenuItem在设计程序时, 有时我们需要动态地创建菜单,
53、 通常我们使用以下的语句PopupMenu1:=TPopupMenu.Create(Self;Item:=TMenuItem.Create(PopupMenu1;Item.Caption:='FirstMenu'Item.OnClick:=MenuItem1Click;PopupMenu1Items.Add(Item;Item:=TMenuItem.Create(PopupMenu1;Item.Caption:='SecondMenu'Item.OnClick:=MenuItem2Click;PopupMenu1Items.Add(Item;Item:=TMen
54、uItem.Create(PopupMenu1;Item.Caption:='ThirdMenu'Item.OnClick:=MenuItem3Click;PopupMenu1Items.Add(Item;Item:=TMenuItem.Create(PopupMenu1;Item.Caption:='-'PopupMenu1Items.Add(Item;Item:=TMenuItem.Create(PopupMenu1;Item.Caption:='FourthMenu'Item.OnClick:=MenuItem4Click;PopupMen
55、u1Items.Add(Item;其实我们可以使用一种更快的方法达到同样的功能, 但使用很少的代码, 那就是用NewLine 和NewItem, 看看下面的例子, 是不是很简单?PopupMenu1:=TPopupMenu.Create(Self;withPopUpMenu1ItemsdobeginAdd(NewItem('FirstMenu',0,False,True,MenuItem1Click,0,'MenuItem1'Add(NewItem('SecondMenu',0,False,True,MenuItem2Click,0,'M
56、enuItem2'Add(NewItem('ThirdMenu',0,False,True,MenuItem3Click,0,'MenuItem3'Add(NewLine;/增加一个分割棒Add(NewItem('FourthMenu',0,False,True,MenuItem4Click,0,'MenuItem4'end;对Borland 可视部件的一处改进Borland 公司的Delphi 和C+Builder中均提供了强大的可视化集成开发环境,从而使得Windows 下的应用程序开发变得更为简洁和高效。但是,笔者在
57、使用过程中也发现了Borland 可视部件的一个不足之处。跟踪条作为Win32系统中新增加的通用控件(CommonControl而被应用程序广泛使用(如Windows95中的声卡音量调节程序即为一例 。根据WIN32API 参考手册,该控件有多种不同的风格。其中TBS_ENABLESELRANGE提供了基本的显示风格控制:当跟踪条具备这一风格时,其显示结果如图1所示;当不具备这一风格时,则显示为图2的样子,与我们在音量调节程序中所见到的样子类似。在Borland 可视部件库中跟踪条被封装成TTrackBar 类,其大多数风格均可通过属性窗直接进行修改,唯独无法更改其TBS_ENABLESELRANGE风格,因而只能显示成如图所示的样子,这不能不说是一处缺憾。幸好Borland 公司提供了扩充部件库的简便方法,使我们能够轻松地解决这一问题。下面给出在C+Builder中解决这一问题的源程序。将下面的源程序输入后,启动C+Builder,选择Component 菜单的Install 选项,弹出安装部件对话框。再选择Add 按钮,输入C+源程序文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中国石油广东销售分公司校园招聘笔试模拟试题及答案解析
- 第20课 学看天气预报教案
- 2026年大连地铁运营有限公司校园招聘考试参考题库及答案解析
- 2026年国网甘肃省电力公司校园招聘笔试参考题库及答案解析
- 2026年浙江省农村发展集团有限公司校园招聘笔试备考试题及答案解析
- 锥筒式磁力耦合器传动特性研究及优化设计
- 基于红外热成像技术的办公建筑室内人员热偏好预测研究
- 红松种质资源评价及群体构建技术的研究
- 2026四川成都市都江堰市事业单位赴外考核招聘10人备考题库及参考答案详解【突破训练】
- 2026河北邯郸幼儿师范高等专科学校春季博硕人才选聘26人备考题库含完整答案详解【历年真题】
- 部编版七年级下册语文第二单元集体备课教案(表格式)
- 高二下学期期末英语读后续写画的风波:我和妹妹在奶奶家的冲突讲义
- 教科版四年级下册科学期末测试卷含答案(精练)
- DL-T5054-2016火力发电厂汽水管道设计规范
- 2023河南中医药大学学士学位英语题
- 浙江弘利新材料有限公司年产2万吨造纸化学品中性施胶剂技改项目环境影响报告
- 新能源汽车电池介绍课件
- 车库拆除工程施工方案
- EXCEL培训-EXCEL函数教程
- 呼吸系统解剖生理学课件
- 烧结烟气循环
评论
0/150
提交评论