打印方式(纵向、横向)(100分)

  • 主题发起人 主题发起人 benxiaohai1978
  • 开始时间 开始时间
B

benxiaohai1978

Unregistered / Unconfirmed
GUEST, unregistred user!
控件QuickRep1的打印方式是从左往右打印,也就是说打印多列时,空白在页面右边,
怎么能让它从上向下打印,最后有空白的话,空白在下面。
怎么来实现呢?
 
//我有例子怎么发给你
//你在用两个QRLABEL就可以了,先将QRLABEL赋空。再将表往下移一笔记录就可以了。
procedure TForm1.DetailBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
QRLabel2.caption := '';
if not ADOTable1.Eof then
begin
QRLabel1.Caption := ADOTable1.Fields[0].AsString ;
ADOTable1.next;
end;
if not ADOTable1.Eof then
begin
QRLabel2.Caption := ADOTable1.Fields[0].AsString ;
end;

end;
以下是全部代码。

//PAS
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
QuickRpt, Qrctrls, StdCtrls, Db, ADODB, ExtCtrls, Grids, DBGrids;
type
TForm1 = class(TForm)
QuickRep1: TQuickRep;
DetailBand1: TQRBand;
DataSource1: TDataSource;
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
Button1: TButton;
QRLabel1: TQRLabel;
QRLabel2: TQRLabel;
DBGrid1: TDBGrid;
procedure Button1Click(Sender: TObject);
procedure DetailBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOTable1.Open;
ADOTable1.First;
QuickRep1.Preview;
end;

procedure TForm1.DetailBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
QRLabel2.caption := '';
if not ADOTable1.Eof then
begin
QRLabel1.Caption := ADOTable1.Fields[0].AsString ;
ADOTable1.next;
end;
if not ADOTable1.Eof then
begin
QRLabel2.Caption := ADOTable1.Fields[0].AsString ;
end;

end;

end.


//DFM
object Form1: TForm1
Left = 192
Top = 107
Width = 544
Height = 375
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Scaled = False
PixelsPerInch = 96
TextHeight = 13
object QuickRep1: TQuickRep
Left = 40
Top = 224
Width = 794
Height = 1123
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
DataSet = ADOTable1
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'Arial'
Font.Style = []
Functions.Strings = (
'PAGENUMBER'
'COLUMNNUMBER'
'REPORTTITLE')
Functions.DATA = (
'0'
'0'
#39#39)
Options = [FirstPageHeader, LastPageFooter]
Page.Columns = 1
Page.Orientation = poPortrait
Page.PaperSize = A4
Page.Values = (
100
2970
100
2100
100
100
0)
PrinterSettings.Copies = 1
PrinterSettings.Duplex = False
PrinterSettings.FirstPage = 0
PrinterSettings.LastPage = 0
PrinterSettings.OutputBin = Auto
PrintIfEmpty = True
SnapToGrid = True
Units = MM
Zoom = 100
object DetailBand1: TQRBand
Left = 38
Top = 38
Width = 718
Height = 40
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
AlignToBottom = False
BeforePrint = DetailBand1BeforePrint
Color = clWhite
ForceNewColumn = False
ForceNewPage = False
Size.Values = (
105.833333333333
1899.70833333333)
BandType = rbDetail
object QRLabel1: TQRLabel
Left = 40
Top = 16
Width = 58
Height = 17
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
Size.Values = (
44.9791666666667
105.833333333333
42.3333333333333
153.458333333333)
Alignment = taLeftJustify
AlignToBand = False
AutoSize = True
AutoStretch = False
Caption = 'QRLabel1'
Color = clWhite
Transparent = False
WordWrap = True
FontSize = 10
end
object QRLabel2: TQRLabel
Left = 240
Top = 16
Width = 58
Height = 17
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
Size.Values = (
44.9791666666667
635
42.3333333333333
153.458333333333)
Alignment = taLeftJustify
AlignToBand = False
AutoSize = True
AutoStretch = False
Caption = 'QRLabel2'
Color = clWhite
Transparent = False
WordWrap = True
FontSize = 10
end
end
end
object Button1: TButton
Left = 112
Top = 16
Width = 75
Height = 25
Caption = '预览'
TabOrder = 1
OnClick = Button1Click
end
object DBGrid1: TDBGrid
Left = 104
Top = 56
Width = 353
Height = 153
DataSource = DataSource1
TabOrder = 2
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'MS Sans Serif'
TitleFont.Style = []
end
object DataSource1: TDataSource
DataSet = ADOTable1
Left = 32
Top = 24
end
object ADOConnection1: TADOConnection
Connected = True
ConnectionString =
'Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data ' +
'Source=C:/Program Files/Common Files/Borland Shared/Data/dbdemos' +
'.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:Syste' +
'm database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Pass' +
'word="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=' +
'1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Tran' +
'sactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create S' +
'ystem Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:' +
'Don'#39't Copy Locale on Compact=False;Jet OLEDB:Compact Without Rep' +
'lica Repair=False;Jet OLEDB:SFP=False'
LoginPrompt = False
Mode = cmShareDenyNone
Provider = 'Microsoft.Jet.OLEDB.4.0'
Left = 80
Top = 112
end
object ADOTable1: TADOTable
Connection = ADOConnection1
TableName = 'country'
Left = 64
Top = 208
end
end
 
我的信箱是 xuqiang88991@163.com
 
能给我一份吗? yhhe_zhr@163.net
 
我收到了,谢谢!我看看程序。
 
to yhhe: 我弄好之后,给你发一份完整的。
 
程序我已经看了,我的意思是指分栏打印时空白在页面右边,
怎么能让它从上向下打印,最后有空白的话,空白在下面。
 
我也是你说的意思,但是这个程序有点不太像。我再研究一下。
 
QRLabel1是一列,QRLabel2是一列,
程序打印是这样的吧!
QRLabel1 QRLabel2
Argentina Bolivia
Brazil Canada
Chile Colombia
Cuba Ecuador
El Salvador Guyana
Jamaica Mexico
Nicaragua Paraguay
Peru United States of America
Uruguay Venezuela
如果单列打印的话就是
Argentina
Bolivia
Brazil
Canada
Chile
Colombia
Cuba
Ecuador
El Salvador
Guyana
Jamaica
Mexico
Nicaragua
Paraguay
Peru
United States of America
Uruguay
Venezuela
 
要不你把以下代码注解掉试一下。
if not ADOTable1.Eof then
begin
QRLabel1.Caption := ADOTable1.Fields[0].AsString ;
ADOTable1.next;
end;
 
我不是这个意思。
你看一下这个例子就明白了。
在安装Delphi的目录下的Demos/Quickrpt/Qr3下的例子中,
ExprMemo example 显示的结果。当最后一页没有显示满时,
它是右边空白,从左边开始显示。我要的是从上面开始的,空白在下面。
 
计算每页的打印行数 n
计算当前页要打印的行数 m
if m<2n then
begin
移动到本页的第一行
如果没到结尾
begin
将内容写入左边
end
else
begin
结束打印
end;
移动m/2行,
如果没到结尾
begin
写入右边
移动-m/2行
end
移动到下一行
end
else
begin
......
end;
 
To Cjzhou:
能写两句代码吗?我不知道怎么写打印语句。
我的程序是把QuickRep1连在ADOTable1上,直接从数据库中取值。
我不知道怎么用语句控制。
 
可以给我一份么?
csl_i@163.com
thanks
 
To gamegirl:你要的是什么?
 
下面的代码如有不对的地方,请根据实际情况修改
设置全局变量或设置在窗体的public中
printcontinue:boolean;//判断是否继续打印
CurrentIndex:integer;//打印行索引
Introwscount:integer//剩余行数
//截获quickreport的OnBeforePrint事件
procedure TFrm_FloorInfo.QR_FloorInfoBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
begin
printcontinue:=true;
CurrentIndex:=1
end;
//截获quickreport的OnNeedData事件
procedure TFrm_FloorInfo.QR_FloorInfoNeedData(Sender: TObject;
var MoreData: Boolean);
var
rowsperpage:integer;//每页的行数
temprows:integer;
begin
MoreData:=true;//继续打印
rowsperpage:=38;
if (CurrentIndex mod rowsperpage)=1 then
//每页的第一行
begin
//计算剩余行数
Introwscount:=Qry_FloorInfo.moveby(rowsperpage*2);
Qry_FloorInfo.moveby((-1)*Introwscount);

if Introwscount<(rowsperpage*2) then
Introwscount+1;
end;

if printcontinue=false then
//如果上一条到记录尾,
MoreData:=false;
//停止打印
if MoreData then
//如果继续打印
if ((not Qry_FloorInfo.Eof) and (CurrentIndex mod rowsperpage)<=round(Introwscount/2)) then
//如果没到记录尾并且没有到剩余记录的中间
begin
//显示信息左边信息
QRLbl_TypeCode1.Caption:=Qry_FloorInfo.FieldByName('FloorCode').AsString;
QRLbl_TypeName1.Caption:=Qry_FloorInfo.FieldByName('FloorName').AsString;
temprows:=Qry_FloorInfo.moveby(round(Introwscount/2));
if not Qry_FloorInfo.Eof then
begin
QRLbl_TypeCode2.Caption:=Qry_FloorInfo.FieldByName('FloorCode').AsString;
QRLbl_TypeName2.Caption:=Qry_FloorInfo.FieldByName('FloorName').AsString;
end
else
begin
QRLbl_TypeCode2.Caption:='';
QRLbl_TypeName2.Caption:='';
end;
Qry_FloorInfo.moveby((-1)*temprows);
Qry_FloorInfo.Next;
Inc(CurrentIndex);
MoreData :=true;
end
else
begin
if (CurrentIndex mod rowsperpage)=0 then
begin
QRLbl_TypeCode1.Caption:='';
QRLbl_TypeName1.Caption:='';
QRLbl_TypeCode2.Caption:='';
QRLbl_TypeName2.Caption:='';
printcontinue:=false;
end
else
begin
QRLbl_TypeCode1.Caption:='';
QRLbl_TypeName1.Caption:='';
QRLbl_TypeCode2.Caption:='';
QRLbl_TypeName2.Caption:='';
Inc(CurrentIndex);
end;

end;


end;

 
To Cjzhou:
这段代码我有点看不懂。你看看
D:/Program Files/Borland/Delphi7/Demos/Quickrpt/Qr3下的例子中
ExprMemo example 显示的结果的最后一页,我想让它下面空白,而不是
右边空白。
我再看看你的代码。
谢谢。
 
quickreport在没有设置Dataset的情况下,数据通过OnNeedData得到
当MoreData等于true时打印本行内容
例如:(不是最后一页)
1、将记录集的数据显示在QRLbl_TypeCode1,QRLbl_TypeName1中
2、移动记录集(当前页的行数),记录下来
3、将记录集的数据显示在QRLbl_TypeCode2,QRLbl_TypeName2中
4、移动记录集((-1)*当前页的行数)
5、移动记录集到下一行(5,6步为显示下一行作准备)
6、如果是本业的最后一行,移动记录集(当前页的行数)
最后一页的算法与其它页的区别在于移动的行数为round(记录集最后一页行数/2)
moveby(行数)是移动记录集,返回移动的行数

 
To Cjzhou:你说的我明白了,但是不是我的意思。
举个例子: 每页有10行,每行有6列,和
D:/Program Files/Borland/Delphi7/Demos/Quickrpt/Qr3下的例子中
ExprMemo example 类似。但我要求下面是空白的,而不是右边空白。
你说的方法打印时也是从上向下打印,最终右边是空白的。
你看看D:/Program Files/Borland/Delphi7/Demos/Quickrpt/Qr3下的例子中
ExprMemo example就明白了。
谢谢
 
不会吧这问题就这么难回答吗?还是大家都明白要求我想再次问一下是不是这样。
假如数据库里在有数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
如果单列打印,而且一页只能打印十条的话的话就是
1 11
2 12
3 13
4 14
5 以下空白
6
7
9
10
你现在是不是要这样打印
1 2
3 4
5 6
7 8
9 10
11 12
13 14
以下空白 以下空白
对吗?
 
后退
顶部