高分急送!!! 用QReprot做的报表,有一列实现了自动换行,但造成表格线不连续,怎么办?(200分)

  • 主题发起人 主题发起人 flyingboat
  • 开始时间 开始时间
F

flyingboat

Unregistered / Unconfirmed
GUEST, unregistred user!
我用QReprot做的报表,有一列实现了自动换行,但造成表格线不连续,怎么办?
我的表格线是用QrSharp画的.
问题如下所示:
----------------------------------------------
| XXX | XXXX |XXXXXXXXXXXXXXXX| XXXX | XXX |
| |XXXXXXXXXXXXXXXX| |
| |XXXXXXX | |
----------------------------------------------
这个问题已经烦了我好几天了,希望各位多多指教!
本人将高分赠送!
 
banddetail.beforpring:
QrSharp1.Height:=banddetail.height
 
参考一下LID=330346的帖子
 
以下是我两年前写的一个解决不能画斜线的一个继承于TCQSHARP的控件,
好象也解决了线不能连续的问题, 至少对你应该有帮助.
unit ANCityShape;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
QuickRpt, Qrctrls;
type
TLines = ( None,VLineFLX,TopBottom,BottomTop ) ;
TANCityShape = class(TQRShape)
private
FVHeight: Integer;
FLineType:TLines ;
procedure SetFLineType(Value:TLines) ;
procedure SetFVHeight(Value:Integer) ;
protected
procedure Print(OfsX, OfsY : integer);
override;
procedure Paint ;Override ;
public
published
property LineType:TLines Read FLineType Write SetFLineType ;
property VHeight:Integer Read FVHeight Write SetFVHeight ;
end;

procedure Register;
implementation
procedure TANCityShape.SetFLineType(Value:TLines);
begin
if Value<>FLineType then
begin
FLineType:=Value ;
Invalidate ;
end ;
end ;
procedure TANCityShape.SetFVHeight(Value:Integer);
begin
FVHeight:=Value ;
Invalidate ;
end ;
procedure TANCityQRShape.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 ;
VLineFLX:
begin
Height := Parent.Height;
Top:=0 ;
Width:=4 ;
Shape:=qrsVertLine ;
Inherited Paint ;
end ;
end ;
end ;
procedure TANCityShape.Print(OfsX,OfsY : Integer);
begin
with QRPrinterdo
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:
begin
Inherited Print(OfsX,OfsY ) ;
end ;
VLineFLX:
begin
Canvas.MoveTo(XPos(OfsX + Size.Left), YPos(OfsY + Size.Top)) ;
Canvas.LineTo(XPos(OfsX + Size.Left),YPos(OfsY + Size.Top)+FVHeight ) ;
end ;
end ;
end;
end;

procedure Register;
begin
RegisterComponents('QReport', [TANCityShape]);
end;

end.
 
试试下面这些代码行不行,好象有点误差,要么干脆把QRShape本身删除,记下它的Left座标就行了。
function GetPixels(Value: Extended): Integer;
begin
Result := Round(Value * Screen.PixelsPerInch / 254);
end;

var
LastY: Extended;
procedure TForm1.ColumnHeaderBand1AfterPrint(Sender: TQRCustomBand;
BandPrinted: Boolean);
begin
LastY := QuickRep1.CurrentY;//这一句虽然从逻辑上讲我也不想要它,不过如果没有它...
end;

procedure TForm1.DetailBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
LastY := QuickRep1.CurrentY;
end;

procedure TForm1.DetailBand1AfterPrint(Sender: TQRCustomBand;
BandPrinted: Boolean);
var
CurY: Extended;
begin
CurY := QuickRep1.CurrentY;
with QuickRep1.QRPrinter.Canvasdo
begin
MoveTo(DetailBand1.Left + QRShape1.Left, GetPixels(LastY));//就是这里的QRShape1.Left
LineTo(DetailBand1.Left + QRShape1.Left, GetPixels(CurY));//如果有误差就删掉QRShape,换成绝对数吧
end;
end;
 
请问Liuly,你说的LID=330346的帖子怎么找啊,很惭愧,找了好几天都没有找到.
"不夜城"老兄你所留的控件怎么在D5下编译无法通过啊!
dq老兄的方法好象也不太行得通啊!
不知哪位还有可行的办法,请多多指教,不胜感激!!!
 
to flyingboat:
不行是差在哪儿?什么现象?我试过可以的。
 
多谢dq,问题解决了! :)
开始不行是由于我在把left值改成绝对数时把DetailBand1.Left 也给删除了.
嘿嘿,不好意思!
 
Hi,Dq老兄,
你的方法虽然显示没有任何问题,但是在打印时却打不出来,
只在左上角打了几根短短的竖线,不知道你是否碰到过这个问题,
是否有解决方法?
真惨啊,本来已经把活交了,不料却因此原因遭客户批了一次!
真不知道该如何是好!!!!
 
to flyingboat:
不好意思,我当时试验的时候没考虑打印的问题:)
问题出在GetPixels函数上,那个函数做的是从0.1mm单位到像素单位数值的转换;
但依据的是屏幕的分辨率,而打印的时候应该换成打印机的垂直分辨率。
简单的解决办法是不用它,换用TQRPrinter的YSize函数——
with QuickRep1.QRPrinter, QuickRep1.QRPrinter.Canvasdo
begin
MoveTo(DetailBand1.Left + QRShape1.Left, YSize(LastY));
LineTo(DetailBand1.Left + QRShape1.Left, YSize(CurY));
end;
——试试看行不行?
 
唉,又搞错了!水平方向还没调整——
procedure TForm1.DetailBand1AfterPrint(Sender: TQRCustomBand;
BandPrinted: Boolean);
var
X: Integer;
CurY: Extended;
begin
CurY := QuickRep1.CurrentY;
with QuickRep1.QRPrinter, QuickRep1.QRPrinter.Canvasdo
begin
X := XSize(QuickRep1.Page.LeftMargin + QRShape1.Size.Left);
MoveTo(X, YSize(LastY));
LineTo(X, YSize(CurY));
end;
end;
 
dq,你的方法还是有问题,打印出来的线还是不能很好地控制!
打印出来的线的位置很难调,而且不是太连续。
不过还是多谢你的帮助!
另外,我找到了liuly所说的帖子,用他的方法解决了这个问题,
方法相对来说比较简单一些!
 
多人接受答案了。
 
后退
顶部