以下是小编为大家整理的用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
%>
<% 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 制作真实试卷WODR综合2024-02-18
- 大红灯笼高高挂―用3D Studio Max制作灯笼2025-05-07
- 用VC++6.0实现PC机与单片机之间串行通信的方法.net2025-03-14
- 用美图秀秀制作唯美爱情片壁纸,把爱留在桌面2022-12-11