about打印 用quickreport 建立报表来打印查询结果吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在Delphi中,编程人员利用Quick Report控件可以方便地设计和实现静态报表,但对动态报表的制作仍有不便之处。如制作一个列表式报表时,如何动态调节每一列的宽度?由于报表在预览情况下不能修改,只能在预览前将宽度设定好,因此,如何比较方便地预先设定宽度,就成了一个需要解决的问题。 分析问题 首先可想到一种笨办法,就是在确定报表中需要显示的字段后,对每一个字段的宽度赋予一个初始值(比如80),对于需要调整的字段再通过编辑框进行输入修改。这样的确可以达到预期目的,但由于不直观,可能需要多次调整,影响了效率和方便性。 笔者通过实践,利用DBGRID解决了这个问题。由于是制作与数据库相关的报表,其报表记录肯定需要通过一个SQL语句来产生,那么这些记录就可以先显示在一个DBGRID中。由于DBGRID的各列宽度可以动态调节,那么将适当的DBGRID的各列宽度赋给报表中的各列,就一次性达到了我们预期的目的,而且操作非常方便。 设置窗体 建立两个窗体mainform和repform。在mainform上放置edit1、datasource1、query1、dbgrid1、button1(caption为“提取数据”)和button2(caption为“预览报表”),将datasource1.dataset设定为query1,将dbgrid1的datasource设定为datasource1。在repform上放置Quickrep1,并至少将Quickrep1.bands.hascolumnband和Quickrep1.bands.hasdetailband设为true。 编程实现 运行时,在edit1中输入正确的 SQL语句。点击“提取数据”按钮,将相应记录显示在 dbgrid1中。具体的程序代码如下: procedure Tmainform.button1click(sender:TObject); var s:string; begin s:=edit1.text; with query1 do begin close; sql.clear; sql.add(s); open; end; end; 点击“预览报表”按钮,可以看到形成的报表,如果对宽度摆放还有些不满意,可以关闭预览窗口后重新调整。具体的程序代码如下: procedure Tmainform.button2click(sender:TObject); var leftv,i:integer; //leftv为报表起始位置 cheader:Tqrlabel; detailtext:Tqrdbtext; …… begin leftv:=0; for i:=0 to dbgrid1.columns.Count-1 do begin cheader:=TQrlabel.Create(repform); with repform.cheader do begin parent:=repform.columnheaderband1; caption:=dbgrid1.columns[i].fieldname; width:=dbgrid1.columns[i].width; height:=repform.columnheaderband1.height; left:=leftv+2; top:=5; end; ……//在leftv 处画表格竖线 leftv:=dbgrid1.columns[i].width+leftv; end; ……//画表头栏边框。起始位为0,总宽度为leftv,也就是dbgrid1的各列宽度之和 leftv:=0; //显示记录内容 for i:=0 to dbgrid1.columns.Count-1 do begin detailtext:=TQrdbtext.create(repform); with repform.detailtext do begin parent:=repform.detailband1; dataset:=query1; datafield:=dbgrid1.columns[i].fieldname; width:=dbgrid1.columns[i].width; height:=repform.detailband1.height; left:=leftv+2; top:=5; end; ……//在leftv 处画表格竖线 leftv:=dbgrid1.columns[i].width+leftv; end; ……// 画明晰栏边框。 repform.quickrep1.preview();//报表预览 end; 第二种方法:OLE+Excel 已经调试通过!unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, Db, DBTables, Excel97, OleServer;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Edit1: TEdit; DataSource1: TDataSource; Query1: TQuery; DBGrid1: TDBGrid; ExcelWorksheet1: TExcelWorksheet; ExcelWorkbook1: TExcelWorkbook; ExcelApplication1: TExcelApplication; procedure Button5Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button5Click(Sender: TObject); beginQuery1.Close; Query1.SQL.Clear; Query1.SQL.Text :=Edit1.Text ; Query1.Open;end;procedure TForm1.Button1Click(Sender: TObject);vari,row,column:integer;beginTryExcelApplication1.Connect;ExceptMessageDlg('Excel may not be installed',mtError, [mbOk], 0);Abort;End;ExcelApplication1.Visible[0]:=True;ExcelApplication1.Caption:='Excel Application';ExcelApplication1.Workbooks.Add(Null,0);ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);Query1.Open;row:=1;While Not(Query1.Eof) dobegincolumn:=1;for i:=1 to Query1.FieldCount dobeginExcelWorksheet1.Cells.Item[row,column]: =Query1.fields[i-1].AsString;column:=column+1;end;Query1.Next;row:=row+1;end;end;procedure TForm1.Button2Click(Sender: TObject);beginExcelWorksheet1.PrintPreview;end;procedure TForm1.Button3Click(Sender: TObject);beginExcelWorksheet1.PrintOut;end;procedure TForm1.Button4Click(Sender: TObject);beginExcelApplication1.Disconnect;ExcelApplication1.Quit;end;end. 请教,这个SQL语句应该怎样写,在线等待,急!!!谢谢! DBGRID中不能显示负值的问题 一个关于数据库查询的问题,解决马上给分啊!! 怎么改变墙纸 如何向客户机发送消息 ,请手请进....... SQL SERVER数据读取问题, 迷茫呀!!!!!!!!帮个忙吧!!!!!!!!! ado连接远程Oracle(本地不安装Oracle客户端) 请问用API 函数TextOut输出的 文字??? 请教各位大虾了 了 高分请教:如何实现可移动的面板? 我有一张图,我只想保留一部分,剪去其它部分怎么做?
分析问题
首先可想到一种笨办法,就是在确定报表中需要显示的字段后,对每一个字段的宽度赋予一个初始值(比如80),对于需要调整的字段再通过编辑框进行输入修改。这样的确可以达到预期目的,但由于不直观,可能需要多次调整,影响了效率和方便性。
笔者通过实践,利用DBGRID解决了这个问题。由于是制作与数据库相关的报表,其报表记录肯定需要通过一个SQL语句来产生,那么这些记录就可以先显示在一个DBGRID中。由于DBGRID的各列宽度可以动态调节,那么将适当的DBGRID的各列宽度赋给报表中的各列,就一次性达到了我们预期的目的,而且操作非常方便。
设置窗体
建立两个窗体mainform和repform。在mainform上放置edit1、datasource1、query1、dbgrid1、button1(caption为“提取数据”)和button2(caption为“预览报表”),将datasource1.dataset设定为query1,将dbgrid1的datasource设定为datasource1。在repform上放置Quickrep1,并至少将Quickrep1.bands.hascolumnband和Quickrep1.bands.hasdetailband设为true。
编程实现
运行时,在edit1中输入正确的 SQL语句。点击“提取数据”按钮,将相应记录显示在 dbgrid1中。具体的程序代码如下:
procedure Tmainform.button1click(sender:TObject);
var s:string;
begin
s:=edit1.text;
with query1 do
begin
close;
sql.clear;
sql.add(s);
open;
end;
end;
点击“预览报表”按钮,可以看到形成的报表,如果对宽度摆放还有些不满意,可以关闭预览窗口后重新调整。具体的程序代码如下:
procedure Tmainform.button2click(sender:TObject);
var leftv,i:integer; //leftv为报表起始位置
cheader:Tqrlabel;
detailtext:Tqrdbtext;
……
begin
leftv:=0;
for i:=0 to dbgrid1.columns.Count-1 do
begin
cheader:=TQrlabel.Create(repform);
with repform.cheader do
begin
parent:=repform.columnheaderband1;
caption:=dbgrid1.columns[i].fieldname;
width:=dbgrid1.columns[i].width;
height:=repform.columnheaderband1.height; left:=leftv+2;
top:=5;
end;
……//在leftv 处画表格竖线
leftv:=dbgrid1.columns[i].width+leftv;
end;
……//画表头栏边框。起始位为0,总宽度为leftv,也就是dbgrid1的各列宽度之和
leftv:=0;
//显示记录内容
for i:=0 to dbgrid1.columns.Count-1 do
begin
detailtext:=TQrdbtext.create(repform);
with repform.detailtext do
begin
parent:=repform.detailband1;
dataset:=query1;
datafield:=dbgrid1.columns[i].fieldname;
width:=dbgrid1.columns[i].width;
height:=repform.detailband1.height;
left:=leftv+2;
top:=5;
end;
……//在leftv 处画表格竖线
leftv:=dbgrid1.columns[i].width+leftv;
end;
……// 画明晰栏边框。
repform.quickrep1.preview();//报表预览
end;
第二种方法:OLE+Excel 已经调试通过!
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, DBTables, Excel97, OleServer;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Edit1: TEdit;
DataSource1: TDataSource;
Query1: TQuery;
DBGrid1: TDBGrid;
ExcelWorksheet1: TExcelWorksheet;
ExcelWorkbook1: TExcelWorkbook;
ExcelApplication1: TExcelApplication;
procedure Button5Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button5Click(Sender: TObject);
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Text :=Edit1.Text ;
Query1.Open;
end;procedure TForm1.Button1Click(Sender: TObject);
var
i,row,column:integer;
begin
Try
ExcelApplication1.Connect;
Except
MessageDlg('Excel may not be installed',
mtError, [mbOk], 0);
Abort;
End;
ExcelApplication1.Visible[0]:=True;
ExcelApplication1.Caption:='Excel Application';
ExcelApplication1.Workbooks.Add(Null,0);
ExcelWorkbook1.ConnectTo
(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo
(ExcelWorkbook1.Worksheets[1] as _Worksheet);
Query1.Open;
row:=1;
While Not(Query1.Eof) do
begin
column:=1;
for i:=1 to Query1.FieldCount do
begin
ExcelWorksheet1.Cells.Item[row,column]:
=Query1.fields[i-1].AsString;
column:=column+1;
end;
Query1.Next;
row:=row+1;
end;end;procedure TForm1.Button2Click(Sender: TObject);
begin
ExcelWorksheet1.PrintPreview;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
ExcelWorksheet1.PrintOut;
end;procedure TForm1.Button4Click(Sender: TObject);
begin
ExcelApplication1.Disconnect;
ExcelApplication1.Quit;
end;end.