Delphi报表制作技巧20篇 - 图文(6)

2019-06-17 16:56

用Delphi编写打印程序的窍门 如果你想自己用Delphi编写一个打印程序,那么,下面这些技巧或许对你有所帮助。 1.获娶显示当前打印机的分辨率 Windows下的打印分辨对打印程序有着至关重要的作用,如果你想知道打印机的分辨率,请在程序中加入一行:ShowMessage(′水平分辨率′+inttostr(GetDeviceCaps(printer?Handle,LOGPIXELSX))+chr(13)+′垂直分辨率:′+inttostr(GetDeviceCaps(printer?Handle,LOGPIXELSY)));结果就一目了然了。 2.将结果直接送到打印机 Delphi提供了两种打印方式:一是将结果输送到Form,再调用Form的print方法将结果输送到打印机,二是将结果直接输送到打印机。如果你采用第一种方式,则无论你怎样调整Form的PrintScal属性,打印出来的东西也不会让你满意。因此建议采用第二种方式。 .尽量不要使用AssignPrn 管AssignPrn简化了文本打印操作,使输出到打印机像输出到文件一样简单。但简单带来的是一系列的不方便:你无法知道当前打印的行数,无法准确控制行距,无法灵活改变字体字形等等。还是用打印机的Canvas属性进行打印吧。 4.用打印机的点数做度量单位 如果想让打印程序在任何打印机上都能正常地打印,你就必须改变你的度量单位。如果采用固定的度量,不同分辨率的打印效果是不同的。举例来讲:printer?Canvas?rectangle(0,0,360,720)在360×360的佳能4200SP上能打出一个1英寸宽、2英寸高的矩形,但在600×600的惠普6L上只能打出0?6英寸宽、1?2英寸高的矩形。使用打印机的点数做为度量单位是一个明智的选择。具体做法如下:VarPointX,PointY:integer;PointX:=GetDeviceCaps(printer?Handle,LOGPIXELSX);PointY:=GetDeviceCaps(printer?Handle,LOGPIXELSX);printer?Canvas?rectangle(0,0,PointX*1,PointY*2)这样,无论你使用什么样的打印机,都能得到一个1英寸宽、2英寸高的矩形。 5.添加打印程序单元 尽管Delphi在生成窗体时会自动在USES部分加入许多程序单元,但打印程序单元(Printers)却不在之列,要想使打印机正常工作和程序不出错,你还是老老实实手工给它加上吧。 用Delphi实现打印功能 给单位开发软件,涉及一打印模块,我感到颇有兴趣,就拿来其中的一个小功能模块与读者共享。下面以打印在纸张的矩形框内为例简单介绍: 程序要求: 单击[打印]按钮,把Memo的内容最多分三行打印出来,每行最多能容纳22个三号字,限定汉字上限为50个汉字。 编程思路: 用LineTo和MoveTo函数画一矩形框,根据Memo组件的内容长度用Copy函数把它分割为1到3个子串。在矩形框内美观地输出文字时技术处理为:当输出一行时最多可打印18个汉字,当输出多行时第一、二行分别打印16、18个汉字。 编程步骤: 1、首先新建一工程,在窗体上加一个Memo组件Button组件。 2、Memo组件的Lines值为空,MaxLength值为“100”(即50个汉字),字体为“三号字”;Button的Caption值为“打印”。 3、添加[打印]按钮的事件处理过程代码Button1.Click,首先在Interface的Uses部分添加Printers,其完整代码如下: procedure TForm1.Button1Click(Sender: TObject); var StrLen , Left,Top , WordHeight , wordWidth : Integer; ContentStr : String[100]; Str1, Str2, Str3 : String[36]; begin with Printer do begin Canvas.Font.Size:=16; wordHeight:=Canvas.TextHeight ('字'); wordWidth:=Canvas.TextWidth ('字'); Left:=(Printer.PageWidth-wordWidth*22) div 2; Top:=(Printer.PageHeight-wordHeight*7) div 2; BeginDOC; With Canvas do begin Pen.Width:=3; {画一个22字宽,7个字高的矩形框} MoveTo(Left,Top); LineTo(Left+wordWidth*22,Top); LineTo(Left+wordWidth*22,

26

Top+wordHeight*7); LineTo(Left,Top+wordHeight*7); LineTo(Left,Top); ContentStr:=Memo1.Lines.Text; StrLen:=Length(ContentStr); if StrLen< 37 then {分一行打印} begin TextOut(Left+WordWidth*2, Top+Wordheight*3, ContentStr) end else if StrLen< 66 then {在垂直方向中间分两行打印} begin Str1:=Copy(ContentStr, 0, 32); Str2:=Copy(ContentStr, 33, StrLen-32); TextOut(Left+WordWidth*4, Top+WordHeight*(7-2) div 2 , Str1); TextOut(Left+WordWidth*2, Top+WordHeight*(7-2) div 2 + wordHeight, Str2); end else {分三行打印} begin Str1:=Copy(ContentStr,0,32); Str2:=Copy(ContentStr,33,36); Str3:=Copy(ContentStr, 69, StrLen-68); TextOut(Left+WordWidth*4, Top+WordHeight*2, Str1); {左缩进两个汉字} TextOut(Left+WordWidth*2, Top+WordHeight*3, Str2); TextOut(Left+WordWidth*2, Top+WordHeight*4, Str3); end end; EndDoc; end; end; 以上程序在Windows 98/Me+Delphi 6.0调试通过,希望能对初次编写打印功能程序的读者有所帮助。 网络远程报表 目前,阜新市国有大中型企业生产经营监测网已正式投入使用,网络覆盖市经委及全市国有大中型企业,为改变传统的企业报表处理方式,提高机关工作效率,及时、准确反映全市工业企业的生产经营状况,我们设计开发了网络远程报表软件。 1、软件应用的网络环境 ---- 1.1、网络模型 < 此处略去图> 我们采用B/S模式来设计网络远程报表软件。在此模式中,Web服务器实现整个业务处理逻辑,而客户端只提供人机交互界面,这种模式的最大优势可以概括为二点,一是集中化的事物处理逻辑,二是瘦客户机,因此我们可以用较少的资源建立起具有很强伸缩性、且易升级维护的应用系统。 ---- 1.2、系统软件 ---- Web服务器使用的软件有Windows NT Server 4.0 、Microsoft Information Server 3.0、Microsoft SQL Server 7.0 Clients、Borland的数据库引挚。数据库服务器安装的软件有Windows NT Server 4.0、Microsoft SQL Server 7.0。所有客户机全部采用Windows 95或Windows 98操作系统。 2 使用的程序设计工具 Borland公司在开发工具方面一直居于领先地位,特别表现它基于BDE的开放数据库连接技术及可视化快速应用程序开发工具等方面。它的Delphi4不仅是一种高效的开发工具,更提供了面向分布式对象及Web应用的新技术,因此我们选择Delphi4做为应用程序开发工具。 Delphi4提供ISAPI技术用于创建Web交互程序,ISAPI是Microsoft提出的技术标准,用于扩展Microsoft Information Server的功能。 ---- 使用Delphi4建立的ISAPI程序结构如下: < 此处略去图> 结构的核心是Web模块,它是一TWebModule类型的构件,其主要作用有两个,一是负责管理程序使用的非可视化构件及请求处理器,二是充当客户HTTP请求分配器,把客户的请求交给相应的请求处理器。请求处理器能读取客户提交的请求信息,进行相应处理,并产生Html形式的回应信息。内容生成器用于产生Html形式的内容。 ---- Web应用程序工作流程:

27

---- 客户提交Http请求信息给Web服务器,Web服务器根据请求信息类型,把这一Http请求交给相应的Web应用程序。 Web应用程序接收Http请求信息,它建一TWebQuest对象来表示客户请求内容,同时建一TWebResponse对象以存贮回应信息,然后把这两个对象交给Web模块。 ---- Web模块根据TWebquest的内容,调用相应的请求处理器来处理这一请求。 请求处理器读取TWebquest的信息进行处理,根据具体情况,有时请求处理器需借助内容生成器来产生回应内容,有时直接产生回应内容,然后把回应内容放入TWebResponse对象,再回传给Web模块。 ---- 如果这一请求没有处理完,Web模块再选择其它请求处理器来处理,否则,Web模块把回应信息交给Web应用程序。 --- Web应用程序把回应信息交给Web服务器,Web服务器再转交给客户。 3 设计网络报表软件 3.1 定义数据库结构 ...... < 此处略去> 所有企业上报的数据按月分别存储在一个表中,表名为ZB[当前报告期]。每个经济指标在ZB表中有4个字段与之对应,它们分别是Tl### 、Ql###、T###、Q###,其中###为经济指标代码。 ---- 3.2、建立Web应用项目 ----在Delphi4中,选择\,从弹出的窗口中,选中Web Server Applicapion,这样就创建一个ISAPI程序框架。 ---- 3.3、配置非可视化部件 < 此处略去图,>CustomerInfoModule: ---- 它是一TcustomerInfoModule类型模块,其属性定义:Name= CustomerInfoModule;其它属性使用隐含的配置。---- OnCreate事件处理程序: procedure TCustomerInfoModule. CustomerInfoModuleCreate(Sender: TObject); begin Session.Active:=true; Database.Connected:=true; Tcqy.Active:=true; Tzbiao.Active:=true; Tztime.Active:=true; Tzb.TableName:='dbo.zb'+tztime.Fieldvalues['tend']; Tzb.Active:=true; end; ---- OnDestroy事件处理程序: procedure TCustomerInfoModule. CustomerInfoModuleDestroy(Sender: TObject); begin Session.Active:=false; end; ---- Session构件: ---- Session是一Tsession类型的构件,它是连接数据库的上下文。由于ISAPI是多线程应用程序,每个线程都使用独立的上下文来连接数据库,因此需要显示定义Tsession构件,不能使用隐含定义的Tsession构件。 ---- Session构件的属性:Active=False;AutoSessionName=True;Name=Session;其它属性使用隐含的配置。 ---- Database构件: ---- Database是一Tdatabase类型构件,它用来管理数据库连接,使用自定义的Database构件,可以对数据库连接进行控制。 ---- Database 构件的属性:AliasName=qydata;Connected=False;DatabaseName=Company; LoginPrompt=False;Params={ Username=xk;Password=xk};Name=Database;其它属性使用隐含配置。 ---- Tcqy构件: ---- Tcqy为一TTable类型构件,它提供对数据库表cqy访问。 ---- Tcqy构件属性:Active=False;DatabaseName=Company;Name=Tcqy; Tablename=dbo.cqy;其它属性使用隐含配置。 ---- Tzbiao、Tztime、Tzb同为TTable类型构件,属性设置与Tcqy构件相似,它们分别与数据表zbiao、ztime、zb相对应。 ---- Page构件: ---- Page为一TPageProducer类型的构件,利用此构件可产生Html形式的内容。 ---- Page构件的属性: Name=Page HTMDoc的内容: < html > < /head > < body > ,,, < #title > //标签的内容由OnHTMTag事件处理 ,,, < /body > < /html > ---- 其它属性使用隐含配置。 ---- Page构件的OnHTMLTag事件处理程序: procedure TCustomerInfoModule.PageHTMLTag(Sender: TObject; Tag: TTag; const TagString: String; TagParams: TStrings; var ReplaceText: String); begin ReplaceText:=''; Tzbiao.first; while not Tzbiao.eof do begin ReplaceText:=ReplaceText+'< tr >'; ReplaceText:=ReplaceText+' < td width=\+Tzbiao.Fieldvalues['name']+'< /td >'; ReplaceText:=ReplaceText+' < td width=\Tzbiao.Fieldvalues['dan']+'< /td>'; ReplaceText:=ReplaceText+'< td width=\

28

size=\ReplaceText:=ReplaceText+ '< td width=\< input type=\name='+'Q'+TzbiaoFieldvalues['dm']+' size=\maxlength=\ReplaceText:=ReplaceText+'< /tr >'; Tzbiao.next; end; end; ---- 3.4、定义请求处理器 ---- 网络报表软件总共需要二个请求处理器,下面分别介绍它们的功能及配置。 ---- Control处理器 ---- 它用来产生输入报表的HTTP页面。 ---- Control的属性:Default=False;Enabled=True;methodTtpe=mtPost;Name=control;PathInfo =/control. ---- Control的OnAction事件处理程序: procedure TCustomerInfoModule.CustomerInfoModulecontrolAction( Sender: TObject; Request: TWebRequest;Response: TWebResponse; var Handled: Boolean);beginResponse.content:=page.content;Response.SendResponse;end; ---- 产生的回应内容显示如下: < 此处略去图,全文可下载 > ---- Append处理器 ---- 它用来把报表数据追加到数据库表中。 ---- Append 的属性:Default=False;Enabled=True;MethodTtpe=mtPost;Name=append;PathInfo =/append。 ---- Append 的OnAction事件处理程序: < 此处略去> ---- 3.5 访问SQL Server 7.0的方法 ---- 我们使用ODBC界面实现对SQL Server 7.0的访问。ODBC是一个用于访问数据库的统一界面,它具有良好的数据库独立性,通过ODBC可以访问各种类型的数据库系统。 ---- 在配置ODBC时,选择\系统 DSN\方式管理数据源,这样的数据源属于本地计算机,而不属于具体用户,所以Web服务器的匿名帐号就能识别SQLServer7.0的数据源。 ---- 3.6 安全处理 ---- 利用法人代码与操作密码存在的一一对应关系,来控制用户对后台应用程序的调用。 由于所有报表用户都有相同的数据库操作权限,所以采用所有用户共享一个SQL server帐号来实现对数据库表的访问。 4 安装应用程序 由于WWW的匿名帐号有权运行Scripts目录下的程序,所以把网络报表程序放入WWW的子目录Scripts中,网络用户就能通过游览器访问后台的应用程序。 ---- [本文为节略] 中国式报表 在众多可视化数据库开发工具中, Delphi以其真正的面向对象、高效率、支持多层结构应用开发、支持多层B/S结构开发等优良特性脱颖而出,成为广大编程人员的首选开发工具。 ---- 在数据库应用程序开发中,系统设计员、程序设计员需要考虑的一个重要问题是如何设计和输出报表,在Delphi中我们可以采用多种方案来解决这一问题,如运用OLE自动化技术将数据输出到MS-WORD、MS-EXCEL中等,但其中最直接、最本地化的还是使用Delphi3.0/40中的QuickReport报表组件,它是挪威QuSoft公司专门为Delphi 编写的,使用QuickReport可以迅速设计出符合西方人习惯的报表。 ---- 然而,在设计中国式报表时,笔者发现在QuickReport中设计列与列之间的竖线和斜线比较困难;虽然QuickReport提供了TQShape控件,使用该控件可以画出列与列之间的竖线,但如果用户不能正确调整TQShape实例的高度,输出报表中的竖线不是不连续就是超长,另外如果我们调整了某个Band的高度,我们将不得不调整该Band下的所有TQShape实例的高度;至于斜线,QuickReport报表组件根本就没有提供这一功能。 ---- 笔者认真查找了有关资料,成功地解决以上问题,并愿意将解决方法与大家共享,希望能对大家有所帮助。 ---- 1、 解决思路 ---- 以TQShape为父类,建立新的控件,新控件可以画竖线、斜线和反斜线。

29

---- 重载TQShape 类的Paint方法,这样在设计阶段可以非常直观地画斜线、反斜线和竖线,用户可以在设计阶段选择线的类型,如果选择直线,控件自动将其高度调整为所属Band的高度,用户可以调整其横向位置但不能调整其高度;如果选择斜线,用户可以根据需要调整斜线的长度和倾角。 ---- 重载TQShape 类的Print方法,这样可以在运行阶段输出直线和斜线。 ---- 说明:该控件只能画直线和斜线,如果读者需要画矩形和园,可以使用TQShape控件来实现。 ---- 2、控件设计步骤 ---- 步骤1、使用Delphi提供的控件向导,选择TQShape为父类,建立新类TMyQRShape,并选择适当的包(Package),最后生成单元文件。 ---- 步骤2、在生成的单元文件中,增加枚举类型, TLines = ( None,TopBottom,BottomTop ) ;None、TopBottom、BottomTop三种取值,分别代表直线、斜线 \\ 和反斜线 / 。 ---- 步骤3、在新类TMyQRShape 中增加private 成员 FLineType:TLines ,增加published属性 LineType:TLines Read FLineType Write SetFLineType 。 ---- 步骤4、建立过程SetFLineType 。 ... ... ---- 步骤5、重载Paint方法 ... ... ---- 步骤6、重载Print方法 ... ... ---- 步骤7、保存并安装TMyQRShape控件。

30


Delphi报表制作技巧20篇 - 图文(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:西兴互通边施工边通车安全专项方案 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: