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. Django项目部署(阿里云)(2)--扩展

    新博客地址:http://muker.net/django-server-two.html 前面的只是最简单的部署,真实情况总是更复杂一点实际流程大概是这么操作的(我这种菜鸟的想法):本地写代码-&g ...

  2. BZOJ3675 Apio2014 序列分割 【斜率优化】

    Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...

  3. 关于Mybatis将查询结果中添加常量列并返回

    引言 在使用mybatis的时候,查询一个集合返回给前台页面,在有的时候,我们会添加一个常量字段到对象或者集合中,来标识这个对象属于的类型等等情况,当前台进行再次请求的时候携带此变量进行请求. 但是: ...

  4. Python学习-使用Python爬取陈奕迅新歌《我们》网易云热门评论

    <后来的我们>上映也有好几天了,一直没有去看,前几天还爆出退票的事件,电影的主题曲由陈奕迅所唱,特地找了主题曲<我们>的MV看了一遍,还是那个感觉.那天偶然间看到Python中 ...

  5. Request对象主要用于获取来自客户端的数据,如用户填入表单的数据、保存在客户端的Cookie等。

    1.主要属性  ApplicationPath  获取服务器上asp.net应用程序的虚拟应用程序根路径  Browser  获取有关正在请求的客户端的浏览器功能的信息,该属性值为:HttpBrows ...

  6. LG3565 [POI2014]HOT-Hotels

    题意 有一个树形结构,每条边的长度相同,任意两个节点可以相互到达.选3个点.两两距离相等.有多少种方案? 1≤n≤5 000 分析 参照小塘空明的题解. 很明显到一个点距离相等的三个点两两之间距离相等 ...

  7. Android学习路线总结,绝对干货(转)

    title: Android学习路线总结,绝对干货tags: Android学习路线,Android学习资料,怎么学习androidgrammar_cjkRuby: true--- 一.前言 不知不觉 ...

  8. Bootstrap组件福利篇:十二款好用的组件推荐

    阅读目录 一.时间组件 1.效果展示 2.源码说明 3.代码示例 二.自增器组件 1.效果展示 2.源码说明 3.代码示例 三.加载效果 一.实用型 二.炫酷型 四.流程图小插件 1.效果展示 2.源 ...

  9. win7怎么安装和启动 jboss

    本文以JBoss Application Server 4.2.1 GA(以下简称JBoss)为例,介绍它在Windows平台上的启动过程.为了方便叙述,对平台环境做以下假定:Java运行时的安装路径 ...

  10. 13.Python接口自动化测试 -- 豆瓣

    1.代码如下所示: import requests,unittest import json import HTMLTestRunner class TestDouBan(unittest.TestC ...