ReportMachine 打印机横向
Portrait 纵向
landscape 横向
RM_reg.pas ;TRMPageSetupForm
打印机设置RM_PageSetup.dfm
TRMPageSetting定义在RM_Printer.pas
TRMPrinterOrientation = (rmpoPortrait, rmpoLandscape);
TRMPageSetting
property PageOr: TRMPrinterOrientation read FPageOr write SetPageOr;
TRMPageSetupForm = class(TForm)
property PageSetting: TRMPageSetting read FPageSetting;
TRMPageLayout = class(TPersistent)
property PageOrientation: TRMPrinterOrientation read FPageOr write FPageOr;
调用打印机设置窗口
RM_reg.pas
procedure TRMPageLayoutProperty.Edit;
打印方法:
RM_Class.pas
procedure TRMReport.PrintReport;

_DoPrintReport函数中
lPrinter := ReportPrinter;
初始值就不对。
ReportPrinter.PaperWidth;
ReportPrinter.PaperHeight;
ReportPrinter.PrintableWidth;
ReportPrinter.PrintableHeight;
RMReport1.LoadFromFile('Untitled5.rmf');装载完文件后,RM_Printer.pas里的FRMPrinter变量就变成真实的宽度了从4961变成7016了。也就是说PrintReport无问题了。
RM_Class.pas
TRMReport.LoadFromStream
PrinterName := RMReadString(aStream); 读出原始值。
Pages.LoadFromStream(FReportVersion, aStream);变成7016了
>lPage.LoadFromStream(aStream);
>TRMReportPage.LoadFromStream
>ChangePaper(FPageSize, PageWidth, PageHeight, FPageBin, FPageOrientation);
RM_Printer.pas
procedure TRMCustomPrinter.DeviceContextChanged;
>FPaperWidth := GetDeviceCaps(FDC, PHYSICALWIDTH); //纸宽 ,单位为打印机象素
再跟踪
function TRMCustomPrinter.GetDC: HDC; FDC有为0 的情况,所以获取值。但是xe8没有为0的情况
TRMPrinter.SetPrinterInfo函数里,aPageWidth,aPageHeight根据横竖算过了,在SetSettings又算一遍,不是又退回来了嘛!
procedure TRMPrinter.SetSettings(aPgWidth, aPgHeight: Integer);
TRMPrinter.SetSettings
lPDevMode := GlobalLock(lDevMode); 这个lPDevMode 为nil,d7中是正常有值,xe8里为nil,导致后续代码未执行。
FDevMode := GlobalAlloc(GHND,DocumentProperties(0, PrinterHandle, PChar(lPrinterInfo.Device), lStubDevMode, lStubDevMode, 0)); //一直为0
D7下
DocumentProperties(0, PrinterHandle, PChar(lPrinterInfo.Device), lStubDevMode, lStubDevMode, 0);=1012;,C6下也是1012;
xe8 delphi下,用Longint类型接受返回值是-1,用dword接受返回的是4294967295,这两个值都是错的,用xe8 c++获得是1076,比c6和d7多是因为用了Unicode的原因?
DocumentProperties()返回最后一个参数设置为 0 时所需的 DEVMODE 缓冲区的字节的数
function DocumentProperties(hWnd: HWND; hPrinter: THandle; pDeviceName: LPWSTR;const pDevModeOutput: TDeviceMode; var pDevModeInput: TDeviceMode;fMode: DWORD): Longint; stdcall; overload;
c6定义
LONG (APIENTRY* pfnDocumentProperties)(HWND hWnd, HANDLE hPrinter, LPTSTR pDeviceName, PDEVMODE pDevModeOutput, PDEVMODE pDevModeInput,DWORD fMode);
第一步获取nSize不正确,A zero for last param returns the size of buffer needed.最后一个参数为0,后3个都是NULL,不用设定DevMode^参数,就正确了。
焦点就是如何缓冲区的大缓冲区字节的数
https://support.microsoft.com/en-us/kb/167345/zh-cn
https://support.microsoft.com/en-us/kb/140285
http://blog.csdn.net/hjfjoy/article/details/4250164
//果然是unicode的差异,导致获得的字节数不一样,以下代码在c6,xec8下都可以执行。结果验证。
void __fastcall TForm35::Button1Click(TObject *Sender)
{
HANDLE hPrinter;
DWORD pDevModeBytes;
OpenPrinter(L"Microsoft XPS Document Writer", &hPrinter, NULL);
pDevModeBytes = DocumentPropertiesW(, hPrinter, L"Microsoft XPS Document Writer", NULL, NULL, ); //
pDevModeBytes = DocumentPropertiesA(, hPrinter, "Microsoft XPS Document Writer", NULL, NULL, ); //
}
LONG
WINAPI
AdvancedDocumentPropertiesA(
IN HWND hWnd,
IN HANDLE hPrinter,
IN LPSTR pDeviceName,
OUT PDEVMODEA pDevModeOutput,
IN PDEVMODEA pDevModeInput
);
LONG
WINAPI
AdvancedDocumentPropertiesW(
IN HWND hWnd,
IN HANDLE hPrinter,
IN LPWSTR pDeviceName,
OUT PDEVMODEW pDevModeOutput,
IN PDEVMODEW pDevModeInput
);
RM_Printer.pas 1334 Line
DocumentProperties(0, PrinterHandle, PChar(lPrinterInfo.Device), lStubDevMode, lStubDevMode, 0);
>改成下面的就好了。
DocumentProperties(0, PrinterHandle, PChar(lPrinterInfo.Device), nil, nil, 0);
这个计算空间,每一种打印机大小都不一样,打印机牌子、型号不一样,空间大小不相同,只能实际计算了。
最后修改正确,监视lPrinter的值如下,和d7相同了。
Draw(MasterReport, lPrinter.Canvas, liRect);

ReportMachine 打印机横向的更多相关文章
- [Q]pdfFactory打印机纸张方向设置为横向
不推荐更改pdfFactory打印机默认纸张方向(默认为横向),更改后可能导致不必要的麻烦(pdfFactory要求所定义的纸张方向与实际的纸张方向需一致,因此若更改为横向,则纸张宽度的定义需大于纸张 ...
- C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)【转】
原文地址:http://blog.csdn.net/ldljlq/article/details/7338772 在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇 ...
- 基于C#在WPF中使用斑马打印机进行打印【转】
原文链接:http://ju.outofmemory.cn/entry/132476 最近在项目中接手了一个比较有挑战性的模块——用斑马打印机将需要打印的内容打印出来.苦苦折腾了两天,总算有所收获,就 ...
- 打印机设置(PrintDialog)、页面设置(PageSetupDialog) 及 RDLC报表如何选择指定打印机
如果一台电脑同时连接多个打印机,而且每个打印机使用的纸张大小各不相同(比如:票据打印钱用的小票专用张,办公打印机用的是A4标准纸),在处理打印类的需求时,如果不用代码干预,用户必须每次打印时,都必须在 ...
- HP P1008打印机如何打印特殊纸张
一.问题的提出 HP P1008中间有一个进纸槽,这是干什么的? 二.问题的分析 查说明,说这个进纸槽是叫做优先进纸槽,用于各种非常规的纸张的打印. 三.问题的解决 弄一张特殊尺寸的纸张,打开要编辑的 ...
- 小票打印机指令集封装(支持EPSON指令)
最近写了一些关于小票打印机的程序,不难,但是记录下来,作为足迹吧. 现在市场上的小票机基本都支持EPSON指令.指令集文档 对指令集进行了自己的封装,方便以后调用: package aheiziUti ...
- bootstrap-内联表单 水平(横向)表单 响应式图片 辅助类 [转]
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Delphi水晶横向竖向打印
最近做一个打印项目,本来报表已经设为横向打印了,可是运行程序,打印出来的是竖向的,非要在打印机里再设定为横向,郁闷了很久,看看UCrpe32的源码之后,由于我重新封装了TCrpe,在TCrpe的派生类 ...
- Java读取打印机自定义纸张.
打印出现截断? 对于自定义纸张打印, 一定要先在打印机配置那边添加, 不然会出现截断. 例如打印1000*500, 出来是正常的, 打印216*139, 出现了截断. 因为java默认的打印, 会从打 ...
随机推荐
- WEB服务器都在做哪些工作?
作为WEB开发人员,我们肯定应该要知道WEB服务器都在做哪些工作,这里简单列举一下,有时间然后详细说明. (1)建立连接——接受一个客户端连接. (2)接收请求——从网络中读取一条 HTTP 请求报文 ...
- C++中atof函数的实现和atoi的实现
在C++中有两个系统函数可以实现字符串转浮点型和字符串转整形,下面实现一下这两个函数. #include <iostream> #include <string> using ...
- 隐居网V2.0
经过一个月加班加点的努力,我们终于把隐居网V2.0版做好了(一个设计两个前端三个程序).上一版的隐居网因为经验不够底层架构没搭好(前台和后台都是),又是赶工期,导致后面越做越坑爹.所谓从哪里跌倒从哪里 ...
- HDU - 6513 Reverse It (SYSU校赛C题)(组合数学+容斥)
题目链接 题意:给定一个n*m的矩阵,可以选择至多两个子矩阵将其反转,求能形成多少种不同的矩阵. 任选一个矩阵有$C_{n+1}^{2}C_{m+1}^{2}$种方法,任选两个不同的矩阵有$C_{C_ ...
- HDU1671 水题字典树
#include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #inc ...
- sublime text3安装以及插件配置教程
http://blog.csdn.net/feizaosyuacm/article/details/54729891 本文是安装的Sublime Text3是portable version(可移动版 ...
- 每天一个linux命令(文件操作):【转载】which命令
我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. ...
- Luogu3576 POI2014 MRO-Ant colony 【树形DP】*
Luogu3576 POI2014 MRO-Ant colony The ants are scavenging an abandoned ant hill in search of food. Th ...
- 【2018.06.26NOIP模拟】T2号码bachelor 【数位DP】*
[2018.06.26NOIP模拟]T2号码bachelor 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的性质 ...
- ES6中let和const详解
let和var一样也是用来定义变量,不同之处在于let是块级作用域,只在所定义的块级作用域中生效,一个花括号便是一个块级作用域 {var a="我是var定义的";let b=&q ...