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 打印机横向的更多相关文章

  1. [Q]pdfFactory打印机纸张方向设置为横向

    不推荐更改pdfFactory打印机默认纸张方向(默认为横向),更改后可能导致不必要的麻烦(pdfFactory要求所定义的纸张方向与实际的纸张方向需一致,因此若更改为横向,则纸张宽度的定义需大于纸张 ...

  2. C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)【转】

    原文地址:http://blog.csdn.net/ldljlq/article/details/7338772 在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇 ...

  3. 基于C#在WPF中使用斑马打印机进行打印【转】

    原文链接:http://ju.outofmemory.cn/entry/132476 最近在项目中接手了一个比较有挑战性的模块——用斑马打印机将需要打印的内容打印出来.苦苦折腾了两天,总算有所收获,就 ...

  4. 打印机设置(PrintDialog)、页面设置(PageSetupDialog) 及 RDLC报表如何选择指定打印机

    如果一台电脑同时连接多个打印机,而且每个打印机使用的纸张大小各不相同(比如:票据打印钱用的小票专用张,办公打印机用的是A4标准纸),在处理打印类的需求时,如果不用代码干预,用户必须每次打印时,都必须在 ...

  5. HP P1008打印机如何打印特殊纸张

    一.问题的提出 HP P1008中间有一个进纸槽,这是干什么的? 二.问题的分析 查说明,说这个进纸槽是叫做优先进纸槽,用于各种非常规的纸张的打印. 三.问题的解决 弄一张特殊尺寸的纸张,打开要编辑的 ...

  6. 小票打印机指令集封装(支持EPSON指令)

    最近写了一些关于小票打印机的程序,不难,但是记录下来,作为足迹吧. 现在市场上的小票机基本都支持EPSON指令.指令集文档 对指令集进行了自己的封装,方便以后调用: package aheiziUti ...

  7. bootstrap-内联表单 水平(横向)表单 响应式图片 辅助类 [转]

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. Delphi水晶横向竖向打印

    最近做一个打印项目,本来报表已经设为横向打印了,可是运行程序,打印出来的是竖向的,非要在打印机里再设定为横向,郁闷了很久,看看UCrpe32的源码之后,由于我重新封装了TCrpe,在TCrpe的派生类 ...

  9. Java读取打印机自定义纸张.

    打印出现截断? 对于自定义纸张打印, 一定要先在打印机配置那边添加, 不然会出现截断. 例如打印1000*500, 出来是正常的, 打印216*139, 出现了截断. 因为java默认的打印, 会从打 ...

随机推荐

  1. WEB服务器都在做哪些工作?

    作为WEB开发人员,我们肯定应该要知道WEB服务器都在做哪些工作,这里简单列举一下,有时间然后详细说明. (1)建立连接——接受一个客户端连接. (2)接收请求——从网络中读取一条 HTTP 请求报文 ...

  2. C++中atof函数的实现和atoi的实现

    在C++中有两个系统函数可以实现字符串转浮点型和字符串转整形,下面实现一下这两个函数. #include <iostream> #include <string> using ...

  3. 隐居网V2.0

    经过一个月加班加点的努力,我们终于把隐居网V2.0版做好了(一个设计两个前端三个程序).上一版的隐居网因为经验不够底层架构没搭好(前台和后台都是),又是赶工期,导致后面越做越坑爹.所谓从哪里跌倒从哪里 ...

  4. HDU - 6513 Reverse It (SYSU校赛C题)(组合数学+容斥)

    题目链接 题意:给定一个n*m的矩阵,可以选择至多两个子矩阵将其反转,求能形成多少种不同的矩阵. 任选一个矩阵有$C_{n+1}^{2}C_{m+1}^{2}$种方法,任选两个不同的矩阵有$C_{C_ ...

  5. HDU1671 水题字典树

    #include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #inc ...

  6. sublime text3安装以及插件配置教程

    http://blog.csdn.net/feizaosyuacm/article/details/54729891 本文是安装的Sublime Text3是portable version(可移动版 ...

  7. 每天一个linux命令(文件操作):【转载】which命令

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:        which  查看可执行文件的位置.       whereis 查看文件的位置.         ...

  8. Luogu3576 POI2014 MRO-Ant colony 【树形DP】*

    Luogu3576 POI2014 MRO-Ant colony The ants are scavenging an abandoned ant hill in search of food. Th ...

  9. 【2018.06.26NOIP模拟】T2号码bachelor 【数位DP】*

    [2018.06.26NOIP模拟]T2号码bachelor 题目描述 Mike 正在在忙碌地发着各种各样的的短信.旁边的同学 Tom 注意到,Mike 发出短信的接收方手机号码似乎都满足着特别的性质 ...

  10. ES6中let和const详解

    let和var一样也是用来定义变量,不同之处在于let是块级作用域,只在所定义的块级作用域中生效,一个花括号便是一个块级作用域 {var a="我是var定义的";let b=&q ...