用Delphi制作中国式报表.net

时间:2022年12月11日

/

来源:浮木dw

/

编辑:本站小编

收藏本文

下载本文

以下是小编为大家整理的用Delphi制作中国式报表.net,本文共6篇,希望对您有所帮助。本文原稿由网友“浮木dw”提供。

篇1:用Delphi制作中国式报表.net

在数据库应用程序 开发 中,系统设计员、程序设计员需要考虑的一个重要问题是如何设计和输出报表,在Delphi中我们可以采用多种方案来解决这一问题,如运用OLE自动化技术将数据输出到MS-Word、MS-Excel中等,但其中最直接、最 本地化 的还是使用Delphi3.0/40中的

在数据库应用程序开发中,系统设计员、程序设计员需要考虑的一个重要问题是如何设计和输出报表,在Delphi中我们可以采用多种方案来解决这一问题。如运用OLE自动化技术将数据输出到MS-Word、MS-Excel中等,但其中最直接、最本地化的还是使用Delphi3.0/40中的QuickReport报表组件。它是挪威QuSoft公司专门为Delphi 编写的,使QuickReport可以迅速设计出符合西方人习惯用的报表。

然而,在设计中国式报表时,笔者发现在QuickReport中设计列与列之间的竖线和斜线比较困难;虽然QuickReport提供了TQShape控件,使用该控件可以画出列与列之间的竖线,但如果用户不能正确地调整TQShape实例的高度,输出报表的竖线不是不连续就是超长,另外如果我们调整了某个Band的高度,我们将不得不调整该Band下的所有TQShape实例的高度;至于斜线,QuickReport报表组件根本就没有提供这一功能。

笔者认真查找了有关的资料,成功地解决了以上问题,希望能对大家有所帮助。

解决思路

以TQShape为父类,建立新的控件,新控件可以画竖线、斜线和反斜线。重载TQShape 类的Paint方法,这样在设计阶段可以非常直观地画坚线、斜线和反斜线。用户可以在设计阶段选择线的类型,如果选择直线,控件自动将其高度调整为所属Band的高度,用户可以调整其横向位置但不能调整其高度;如果选择斜线,用户可以根据需要调整斜线的长度和倾角。

重载TQShape 类的Print方法,这样可以在运行阶段输出直线和斜线。说明:该控件只能画直线和斜线,如果读者需要画矩形和圆,可以使用TQShape控件来实现。

控件设计步骤

步骤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。

procedure

TMyQRShape.SetFLineType(value:TLines);

begin

if valueFLineType then

begin

FLineType:=value

Invalidate

end

end

步骤5.重载Paint方法。

procedure TMyQRShape.Paint

begin

case LineType of

BottomTop:

begin

Canvas.MoveTo(0,Height)

Canvas.LineTo(width,0 )

end

TopBottom:

begin

Canvas.MoveTo(0,0)

Canvas.LineTo(width,Height )

end

None:

begin

Height := Parent.Height

Top:=0

Width:=4

Shape:=qrsVertLine

Inherited Paint

end

end

end

步骤6.重载Print方法。

procedure TMyQRShape.Print(OfsX,OfsY : Integer);

begin

with QRPrinter do

begin

case LineType of

BottomTop:

begin

Canvas.MoveTo(XPos(OfsX + Size.Left), YPos(OfsY + Size.Top)+Height)

Canvas.LineTo(XPos(OfsX + Size.Left)+width,YPos(OfsY + Size.Top) )

end

TopBottom:

begin

Canvas.MoveTo(XPos(OfsX + Size.Left), YPos(OfsY + Size.Top))

Canvas.LineTo(XPos(OfsX + Size.Left)+Width,YPos(OfsY + Size.Top)+Height )

end

None:

Inherited Print(OfsX,OfsY )

end

end

end;

步骤7.保存并安装TMyQRShape控件,

本控件在Delphi40下调试、安装,并成功地应用于某数据库管理系统的开发中。该控件的完整代码如下:

源程序:

unit MyQRShape;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs,

QuickRpt, Qrctrls;

type

TLines = ( None,TopBottom,BottomTop )

TMyQRShape = class(TQRShape)

private

FLineType:TLines

procedure SetFLineType(value:TLines)

protected

procedure Print(OfsX, OfsY : integer); override;

procedure Paint Override

public

published

property LineType:TLines Read FLineType Write SetFLineType

end;

procedure Register;

implementation

procedure

TMyQRShape.SetFLineType(value:TLines);

begin

if valueFLineType then

begin

FLineType:=value

Invalidate

end

end

procedure TMyQRShape.Paint

begin

case LineType of

BottomTop:

begin

Canvas.MoveTo(0,Height)

Canvas.LineTo(width,0 )

end

TopBottom:

begin

Canvas.MoveTo(0,0)

Canvas.LineTo(width,Height )

end

None:

begin

Height := Parent.Height

Top:=0

Width:=4

Shape:=qrsVertLine

Inherited Paint

end

end

end

procedure TMyQRShape.Print(OfsX,OfsY : Integer);

begin

with QRPrinter do

begin

case LineType of

BottomTop:

begin

Canvas.MoveTo(XPos(OfsX + Size.Left), YPos(OfsY + Size.Top)+Height)

Canvas.LineTo(XPos(OfsX + Size.Left)+width,YPos(OfsY + Size.Top) )

end

TopBottom:

begin

Canvas.MoveTo(XPos(OfsX + Size.Left), YPos(OfsY + Size.Top))

Canvas.LineTo(XPos(OfsX + Size.Left)+Width,YPos(OfsY + Size.Top)+Height )

end

None:

Inherited Print(OfsX,OfsY )

end

end

end;

procedure Register;

begin

RegisterComponents(‘QReport', [TMyQRShape]);

end;

end.

原文转自:www.ltesting.net

篇2:用Delphi制作DLL小结.net

一 Dll的制作一般分为以下几步: 1 在一个DLL工程里写一个过程或函数 2 写一个Exports关键字,在其下写过程的名称,不用写参数和调用后缀。 二 参数传递 1 参数类型最好与window C++的参数类型一致。不要用DELPHI的数据类型。 2 最好有返回值[即使是一个过程

一 Dll的制作一般分为以下几步:

1 在一个DLL工程里写一个过程或函数

2 写一个Exports关键字,在其下写过程的名称。不用写参数和调用后缀。

二 参数传递

1 参数类型最好与window C++的参数类型一致。不要用DELPHI的数据类型。

2 最好有返回值[即使是一个过程],来报出调用成功或失败,或状态。成功或失败的返回值最好为1[成功]或0[失败].一句话,与windowsc++兼容。

3 用stdcall声明后缀。

4 最好大小写敏感。

5 无须用far调用后缀,那只是为了与windows 16位程序兼容。

三 DLL的初始化和退出清理[如果需要初始化和退出清理]

1 DLLProc[SysUtils单元的一个Pointer]是DLL的入口。在此你可用你的函数替换了它的入口。但你的函数必须符合以下要求[其实就是一个回调函数]。如下:

procedure DllEnterPoint(dwReason: DWORD);far;stdcall;

dwReason参数有四种类型:

DLL_PROCESS_ATTACH:进程进入时

DLL_PROCESS_DETACH进程退出时

DLL_THREAD_ATTACH 线程进入时

DLL_THREAD_DETACH 线程退出时

在初始化部分写:

DLLProc := @DLLEnterPoint;

DllEnterPoint(DLL_PROCESS_ATTACH);

2 如Form上有TdcomConnection组件,就Uses Activex,在初始化时写一句CoInitialize (nil);

3 在退出时一定保证DcomConnection.Connected := False,并且数据集已关闭,

否则报地址错。

四 全局变量的使用

在widnows 32位程序中,两个应用程序的地址空间是相互没有联系的。虽然DLL在内存中是一份,但变量是在各进程的地址空间中,因此你不能借助dll的全局变量来达到两个应用程序间的数据传递,除非你用内存映像文件。

五 调用静态载入

1 客户端函数声名:

1)大小写敏感。

2)与DLL中的声明一样。

如: showform(form.:Tform);Far;external'yproject_dll.dll';

3)调用时传过去的参数类型最好也与windows c++一样。

4)调用时DLL必须在windows搜索路径中,顺序是:当前目录;Path路径;windows;widows\\system;windows\\ssystem32;

六 调用动态载入

1 建立一种过程类型[如果你对过程类型的变量只是一个指针的本质清楚的话,你就知道是怎么回事了]。如:

type

mypointer=procedure(form.:Tform);Far;external;

var

Hinst:Thandle;

showform.:mypointer;

begin

Hinst:=loadlibrary('yproject_dll');//Load一个Dll,按文件名找。

showform.:=getprocaddress(Hinst,'showform');//按函数名找,大小写敏感。如果你知道自动化对象的本质就清楚了。

showform(application.mainform);//找到函数入口指针就调用。

Freelibrary(Hinst);

end;

七 在DLL建立一个TForM

1 把你的Form. Uses到Dll中,你的Form用到的关联的单元也要Uses进来[这是最麻烦的一点,因为你的Form或许Uses了许多特殊的单元或函数]

2 传递一个Application参数,用它建立Form.

共2页: 1 [2] 下一页

原文转自:www.ltesting.net

篇3:利用ASP制作EXECL报表方法.net

很多时候我们需要把表格形式的数据转换成EXECL的形式呈现在用户面前,其中有好几个方法可以做到一点,我将介绍一种利用ASP完成的方法,该方法允许 服务器 动态地创建EXECL报表而且不用占用任何服务器空间,该方法还允许多个用户同时收到该数据。但是该方法至

很多时候我们需要把表格形式的数据转换成EXECL的形式呈现在用户面前,其中有好几个方法可以做到一点,我将介绍一种利用ASP完成的方法,该方法允许服务器动态地创建EXECL报表而且不用占用任何服务器空间。该方法还允许多个用户同时收到该数据。但是该方法至少需要EXECL 97的支持。

废话少说,要完成这个工作最重要的是要告诉浏览器HTTP头,就用如下代码:

<%

Response.ContentType = “application/vnd.ms-excel”

%>

下面来看一个例子,假设现在有如下形式的数据:

flavor qty_baked qty_eaten qty_sold price

Boston 24 2 10 0.5

Jelly 24 1 12 0.5

Strawberry 36 1 15 0.5

Chocolate 24 2 6 0.75

Maple 12 1 6 0.75

客户要求用EXECL的形式表现出来,并且希望其中能加上其他一些计算汇总

用如下代码:

……

<%

Response.ContentType = “application/vnd.ms-excel”

set conntemp=server.createobject(“adodb.connection”)

cnpath=“DBQ=” & server.mappath(“/stevesmith/data/timesheet.mdb”)

conntemp.Open “DRIVER={Microsoft Aclearcase/” target=“_blank” >ccess Driver (*.mdb)}; “ & cnpath

set RS=conntemp.execute(”select * from donut“)

%>

<%

' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

' % Loop through Fields Names and print out the Field Names

' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

j = 2 'row counter

For i = 0 to RS.Fields.Count - 1

%>

<% = RS(i).Name %>

<% Next %>

On Hand (calculated)

Gross (calculated)

<%

' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

' % Loop through rows, displaying each field

' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Do While Not RS.EOF

%>

<% For i = 0 to RS.Fields.Count - 1

%>

<% = RS(i) %>

<% Next %>

=b<%=j%>-c<%=j%>-d<%=j%>

=d<%=j%>*e<%=j%>

<%

RS.MoveNext

j = j + 1

Loop

' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

' % Make sure to close the Result Set and the Connection object

' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

RS.Close

%>

Totals

=SUM(B2:B6)

=SUM(C2:C6)

=SUM(D2:D6)

n/a

=SUM(F2:F6)

=SUM(G2:G6)

……

这样我们就实现了目的,用户可以在浏览器窗口就打开它进行简单操作,也可以保存到硬盘上进行其他操作,

我还将介绍一种利用filesystemobject操作的方法。请稍候。:)废话少说,请看代码:

runquery.asp

<%@ LANGUAGE=”VBSCRIPT“ %>

<%

'DSNless connection to Access Database

strDSNPath = ”PROVIDER=MSDASQL;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=“ & Server.MapPath(”testDB.mdb“)

%>

请自己COPY这个文件

<%

server.scripttimeout=1000

Response.Buffer = True

if(Request.Form(”ReturnAS“) = ”Content“) then

Response.ContentType = ”application/msexcel“

end if

Response.Expires = 0

dim oConn

dim oRS

dim strSQL

dim strFile

Set Conn = Server.CreateObject(”ADODB.Connection“)

Set RS = Server.CreateObject(”ADODB.Recordset\")

strSQL = BuildSQL

oRS.Open strSQL, strDSNPath, adOpenForwardOnly, adLockReadOnly, adCmdText

%>

共3页: 1 [2] [3] 下一页

原文转自:www.ltesting.net

篇4:用PowerBuilder制作指示灯.net

在安装各种软件或微软公司产品时会有直观可爱的条状指示灯,它总是以最直接的方式告诉我们工作的进程情况,在PowberBuilder 中也可以实现, 1. 创建一个应用程序(working-out)。 2. 创建一个窗口(w_01)。 3. 在应用程序的Open事件中最未尾Open()函数改为

在安装各种软件或微软公司产品时会有直观可爱的条状指示灯,它总是以最直接的方式告诉我们工作的进程情况,在PowberBuilder 中也可以实现。

1. 创建一个应用程序(working-out)。

2. 创建一个窗口(w_01)。

3. 在应用程序的Open事件中最未尾Open()函数改为Open(w_01)。

4. 编辑w_01窗口。

5. 添加三个控件在 w_01窗口上,即两个Rectangle :r_1,r_2 和一个commandButton :cb_1。

6. 将 r_1的Fill Color:设为White 将Line Color:设为Black,将X设为243,Y设为645,Width设为1541,Height设为113,

按Apply 或 OK即可。

7. 将 r_2的Fill Color:设为Blue 将Line Color:设为White,将X设为261,Y设为661,Width设为5,Height设为85。按“Apply” 或 “OK”即可。

8. 在cb_1的 clicked事件中添写:

r_1.visible= true

r_2.visible = true

int lock

lock=0

do while lock <100

lock = lock + 1

r_2.width=lock*15

loop

9. 按 “Run” 键运行此程序,就会看到一条从头走到尾的像安装Win98一样的指未灯出现在你的程序窗口上。

注:此程序只是作为一个指示灯,那什么时候指示灯该向前走,什么时候指示灯该停,只要想办法用变量给Lock赋值就可以了。

原文转自:www.ltesting.net

篇5:用Excel制作工资报表注意要点详解

某单位会计在用Excel制作工资报表的过程中碰到两个难题,以致每次制作工资报表都要花较长时间加以调整,该会计找到笔者,希望能提供帮助。笔者经分析,发现用Excel制作工资报表须注意两点。

一、问题的提出

1.所得税计算问题

按照个人所得税有关规定,课税工资小于等于1000元时,不纳税;工资大于1000元且小于等于1500元时,税率为5%;工资大于1500元时,税率为10%。该会计应用逻辑函数IF对所得税额作两段处理,在“所得税”P3中输入公式“=IF(O3>1500,(O3-1500)*0.1500*0.05,(O3-1000)*0.05)”,以致课税工资小于等于1000元时无法得出税额为零。其处理情况如图1(原始报表很大,不便观察,该图系对原始报表的缩简)。图中“应税工资”O8、O12分别为908.66、838.26,故“所得税”P8、P12中的值应为0,而现在却分别为4.57和8.09。为了使课税工资小于等于1000元时税额为零,只得重新核查报表并在相关单元格输入零。

图1工资报表

2.工资表平衡问题

该会计每次制作工资表总是难以平衡,误差少则几分钱,多则几角。图1中Q10中的公式为“=O10-P10”,应为1316.82,可表格计算却为1316.83,原因何在?百思不得其解。为了平衡工资表,又得核查修改。

上述两个问题的出现,耗费了会计大量的时间,以至于制作一张工资报表需好几天,有人建议她改用其它软件,可她又不想因改学其它软件而支付学习成本。基于这种考虑,她迫切需要解决以上难题,

二、问题的解决

1.所得税的计算

用逻辑函数IF()计算所得税的思路是正确的,但利用单层IF()函数,无法处理两种以上的状态,单层函数只能按给定表达式的值或真或假,返回两种状态中的一种,以致课税工资小于等于1000元时无法得出税额为零,

而利用IF()函数的嵌套,则可实现对多种状态的处理。所谓函数嵌套,指函数的参数包含子级函数,Excel函数嵌套最多可含7层。鉴于此,可用嵌套函数改写“所得税”P3中的公式,公式为:“=IF(O3>1500,(O3-1500)*0.1500*0.05,IF(O3>1000,(O3-1000)*0.05,0)),并将该公式复制到“P4:P12”。这样处理,课税工资小于等于1000时的税额即可为零,如图2中P8、P12的值为0。

图2P8、P12的值为0

2.工资表的平衡

工资表不平衡源于对所得税小数位数的取舍。按实际意义,所得税应为两位小数,而按税率公式计算的所得税却为三位小数。图1所得税为两位小数只是一种形式,是通过格式化单元格而得到的,实际上它是三位小数。其中,P10形式为16.68,实为16.675,Q10中的值应为:“1333.50-16.675=1316.825”,由于取两位小数,于是出现了:“1333.50-16.68=1316.83”的误差。这种误差只出现于所得税小数第三位为5的情况,至于其它情况则不会出现。一个单位职工人数多达数百人,所得税小数第三位为5的对象肯定不止一个,这样的对象越多,则误差越大。如何解决这一问题?利用舍入函数ROUND(),将所得税由形式上的两位小数变为实际的两位小数,即可解决这一问题,即将“所得税”P3中的公式改为:“=IF(O3>1500,ROUND((O3-1500)*0.1500*0.05,2),IF(O3>1000,ROUND((O3-1000)*0.05,2),0)),并将该公式复制到“P4:P12”。由此,工资表的平衡问题得到圆满解决。

篇6:用Delphi实现对光驱盘盒的开关控制.net

通常,我们打开和关闭光驱是通过按动光驱上开关按钮来实现的,但有时候手动方式显得很不方便,尤其是在一台电脑上安装多个光驱的情形下,同时光驱的损耗在手动方式下也是最大的,Delphi是个功能强大且容易的编程工具,可不可以利用编程方法来取代手工操作呢?

通常,我们打开和关闭光驱是通过按动光驱上开关按钮来实现的,但有时候手动方式显得很不方便,尤其是在一台电脑上安装多个光驱的情形下,同时光驱的损耗在手动方式下也是最大的,Delphi是个功能强大且容易的编程工具,可不可以利用编程方法来取代手工操作呢?通过摸索与实践终于将这一想法利用Delphi编程得以实现,该程序不但能够控制一个光驱,而且还可以选择性地控制某个光驱和所有光驱的开启与关闭,这对那些操作多个光驱而又懒得弯腰的电脑人确实会方便许多,

用Delphi实现对光驱盘盒的开关控制.net

编程思路:通过弹出菜单及事件控制光驱。

1、弹出菜单的实现

运行Delphi并新建一个工程, 在uses部分引用ReGIStry, Mmsystem两个单元文件,在窗体中添加一个名称为PopmenuCDctrl弹出菜单组建,并添加6个菜单项,窗体TForm1的Popupmenu 项设为PopmenuCDctrl。其中mOpenCDROM(打开CDROM盒)和mCloseCDROM(关闭CDROM盒)菜单将根据电脑中光驱个数自动生成相应的菜单栏目。

2、声明的变量和函数:

… …procedure mCloseAppClick(Sender: TObject);procedure mAutorunClick(Sender: TObject);procedure mNotautorunClick(Sender: TObject);procedure PopmenuCDctrlPopup(Sender: TObject);private { Private declarations } procedure MenuOpenCdrom(Sender : TObject); procedure MenuCloseCdrom(Sender : TObject);var Form1: TForm1; MYDRIVE:char; Mycdrom:pchar; tmppopmenu1,tmpPopmenu2:TMenuItem; function OpenCDROM(Drive:pChar):Boolean; function CloseCDROM(Drive:pChar):Boolean; implementation … …

列出光驱数目和生成子菜单

procedure TForm1.PopupMenu1Popup(Sender: TObject); var Drive :char;begin; mOpenCdrom.Clear; //清除打开光驱子菜单项 mCloseCdrom.Clear; //清除打开光驱子菜单项 //列出光驱数目和生成子菜单 for Drive:='a' to 'z' do beginCase GetDriveType(Pchar(Drive+':\\')) of DRIVE_REMOVABLE: MyDrive:=Drive; DRIVE_FIXED: MyDrive:=Drive; DRIVE_CDROM:begin MyDrive:=Drive; tmppopmenu1:=TMenuItem.Create(Self); tmppopmenu1.AutoHotkeys:=maManual; tmppopmenu1.OnClick := menuOpenCdrom; mOpenCDROM.Add(tmppopmenu1); tmppopmenu1.Caption :=UpperCase(mydrive)+':'; tmppopmenu2:=TMenuItem.Create(Self); tmppopmenu2.AutoHotkeys:=maManual; tmppopmenu2.OnClick := menuCloseCdrom; mCloseCDROM.Add(tmppopmenu2); tmppopmenu2.Caption :=UpperCase(mydrive)+':'; end; DRIVE_RAMDISK: MyDrive:=Drive; DRIVE_REMOTE: MyDrive:=Drive;end;end;//当光驱多于1个生成“所有光驱”控制菜单项if mOpenCDROM.Count >1 thenbegin tmppopmenu1:=TMenuItem.Create(Self); tmppopmenu1.Caption:='所有光驱'; tmppopmenu1.OnClick := menuOpenCdrom; mOpenCDROM.Add(tmppopmenu1); tmppopmenu2:=TMenuItem.Create(Self); tmppopmenu2.Caption:='所有光驱'; tmppopmenu2.OnClick := menuCloseCdrom; mCloseCDROM.Add(tmppopmenu2);end;end;
(责任编辑:铭铭)

原文转自:www.ltesting.net

用Word制作真实试卷

用word制作简历表格的步骤

用Word 制作试卷密封区

用可牛影像制作新年壁纸

用PS制作一个漂亮的立体地球

下载用Delphi制作中国式报表.net(合集6篇)
用Delphi制作中国式报表.net.doc
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档
热门文章
    猜你喜欢
    点击下载本文文档