使用QR制作报表,如何定义纸张等,使得报表能正确输出到LQ1600KIII的连续纸上?

nononono 2004-07-06 01:44:36
现在定义的报表预览正确,打印时右边部分被截掉。

问题解决后,马上给分。
...全文
106 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
nononono 2004-07-06
  • 打赏
  • 举报
回复
问题没有解决,还是给分吧。我决定使用FastReport,反正报表不等着要。
nononono 2004-07-06
  • 打赏
  • 举报
回复
ch_builder(春辉)的代码虽然不能解决这个问题,也还是比较有用的。不过错误太多了,我整理了一下,重新贴出来,基本可以直接使用。供大家参考。

DEVMODE *pDev;
LPPAGESETUPDLG mylp=new PAGESETUPDLG;
memset((void *)mylp,0,sizeof(PAGESETUPDLG));
mylp->lStructSize=sizeof(PAGESETUPDLG);
mylp->hwndOwner=FORM_Rep_KCZM_A->Handle;
mylp->Flags=PSD_RETURNDEFAULT;
PageSetupDlg( mylp );

int OldPaperSize;
int OldOrientation;
int OldLeft;
int OldRight;
int OldTop;
int OldBottom;

if (mylp->hDevMode!=NULL)
{
pDev=(DEVMODE *)GlobalLock(mylp->hDevMode);
pDev->dmPaperSize = OldPaperSize;
pDev->dmOrientation = OldOrientation;
mylp->rtMargin.left = OldLeft;
mylp->rtMargin.right = OldRight;
mylp->rtMargin.top = OldTop;
mylp->rtMargin.bottom = OldBottom;
GlobalUnlock(mylp->hDevMode);
mylp->Flags=PSD_MARGINS|PSD_INHUNDREDTHSOFMILLIMETERS;
if(PageSetupDlg(mylp))
{
pDev=(DEVMODE *)GlobalLock(mylp->hDevMode);
OldPaperSize =pDev->dmPaperSize;
if(OldPaperSize>28)
OldPaperSize=9;//A4
OldOrientation = pDev->dmOrientation;
OldLeft = mylp->rtMargin.left;
OldRight = mylp->rtMargin.right;
OldTop = mylp->rtMargin.top;
OldBottom = mylp->rtMargin.bottom;
FORM_Rep_KCZM_A->QuickRep1->Page->Orientation =OldOrientation-1;
FORM_Rep_KCZM_A->QuickRep1->Page->PaperSize = OldPaperSize;
FORM_Rep_KCZM_A->QuickRep1->Page->LeftMargin =OldLeft/100;
FORM_Rep_KCZM_A->QuickRep1->Page->RightMargin =OldRight/100;
FORM_Rep_KCZM_A->QuickRep1->Page->TopMargin =OldTop/100;
FORM_Rep_KCZM_A->QuickRep1->Page->BottomMargin=OldBottom/100;
GlobalUnlock(mylp->hDevMode);
}
GlobalFree(mylp->hDevMode);
}
delete mylp;

FORM_Rep->QuickRep1->Prepare();
FORM_Rep->QuickRep1->Preview();
nononono 2004-07-06
  • 打赏
  • 举报
回复
谢谢!

这段代码用于打印前设定打印机的纸张尺寸,然后按照设定的尺寸打印报表。但在我执行中,设定打印机的纸张后,实际打印的报表仍然没有突破A4的尺寸。


没有解决问题。


ch_builder 2004-07-06
  • 打赏
  • 举报
回复
DEVMODE *pDev;
LPPAGESETUPDLG mylp=new PAGESETUPDLG;
memset((void *)mylp,0,sizeof
(PAGESETUPDLG));
mylp->lStructSize=sizeof(PAGESETUPDLG);
mylp->hwndOwner=this->Handle;
mylp->Flags=PSD_RETURNDEFAULT;
PageSetupDlg( mylp );
if (mylp->hDevMode!=NULL){
 pDev=(DEVMODE *)GlobalLock(mylp->hDevMode);
 pDev->dmPaperSize =OldPaperSize;
 pDev->dmOrientation =OldOrientation;
 mylp->rtMargin.left =OldLeft;
 mylp->rtMargin.right =OldRight;
 mylp->rtMargin.top =OldTop;
 mylp->rtMargin.bottom=OldBottom;
 GlobalUnlock(mylp->hDevMode);
mylp->Flags=PSD_MARGINS|
PSD_INHUNDREDTHSOFMILLIMETERS;
 if(PageSetupDlg(mylp)){
  pDev=(DEVMODE *)GlobalLock
(mylp->hDevMode);
  OldPaperSize =pDev->dmPaperSize;
if(OldPaperSize>28)OldPaperSize=9;//A4
OldOrientation=pDev->dmOrientation;
OldLeft =mylp->rtMargin.left;
OldRight =mylp->rtMargin.right;
OldTop =mylp->rtMargin.top;
OldBottom =mylp->rtMargin.bottom;
Form2->QuickRep1->Page->Orientation =OldOrientation-1;
Form2->QuickRep1->Page->PaperSize
=OldPaperSize;
Form2->QuickRep1->Page->LeftMargin =OldLeft/100;
Form2->QuickRep1->Page->RightMargin =OldRight/100;
Form2->QuickRep1->Page->TopMargin =OldTop/100;
Form2->QuickRep1->Page->Bottom
Margin=OldBottom/100;
 GlobalUnlock(mylp->hDevMode);
}
 GlobalFree(mylp->hDevMode);
 }
delete mylp;
QRPreview1->PageNumber=1;
Form2->QuickRep1->Prepare();
Form2->QuickRep1->Preview();
用这段代码试试吧
nononono 2004-07-06
  • 打赏
  • 举报
回复
QR的版本是 3.3.0,CB5内带的。

nononono 2004-07-06
  • 打赏
  • 举报
回复
谢谢 ch_builder(春辉)!

那些代码放在Form的OnCreate事件中了,也在预览之前增加了Prepare()(其实没有这句预览也正常),打印机走纸正常,每个送纸器的纸型全部设置成US Std Fanfold。可打印出来的还是A4窄边的宽度。

打印机作业中看到的作业属性里的纸张仍然是A4.

我不明白这个A4从哪里来的?!
ch_builder 2004-07-06
  • 打赏
  • 举报
回复
你上面的这段代码应该没有什么问题,不清楚你用的是QR那个版本?
当然从你的代码来看,我觉得好象放的位置不对,你这个代码应该放在ONCREAT事件中,并且如果是自定义的你应该先用Prepare(),将内容调到内存中来,这样才能正确显示
至于连续打印,这与电脑设置没多少关系,关键是你的打印上设置了,这好象你应该清楚,在LQ机器上有一个连续与单页的转换杆,你试试吧
nononono 2004-07-06
  • 打赏
  • 举报
回复
我将QR控件的属性设置成自定义的340mm宽*280mm长,并有代码如下:
void __fastcall TFORM_Rep_KCZM_A::QuickRep1BeforePrint(
TCustomQuickRep *Sender, bool &PrintReport)
{
QuickRep1->Page->PaperSize = Custom;
QuickRep1->Page->Length = 280;
QuickRep1->Page->Width = 345;
QuickRep1->Page->Orientation = poPortrait;
QuickRep1->Units = MM;
}

我已经把打印机个处设置的纸张都设置为 US Std Fanfold,可报表打印时的打印机作业中看到的作业属性里的纸张仍然是A4.

打印出来的效果怎么都是A4窄边的宽度!
loginwind 2004-07-06
  • 打赏
  • 举报
回复
打印机没设置好!看纸张是否靠最左边,是否设置为叠纸!
nononono 2004-07-06
  • 打赏
  • 举报
回复
补充:必须在打印前用代码设置打印机的属性吗?

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧