ReportMachine不能打开打印设置的解决方法

1、问题现象

在使用ReportMachine作为报表打印时,发现不能调用本机打印机属性设置对话框,如下图:

 点击“属性”按钮后无反应,从而不能对打印机属性进行设置。该问题同时也导致不能获取打印机设置信息。

2、问题原因

跟踪代码发现点击“属性”,会调用“PropertiesDlg”函数,RM_Printer.pas文件中,代码如下:
function TRMPrinter.PropertiesDlg: Boolean;
varlDevMode: THandle;lPDevMode: PDeviceMode;lHandle: THandle;lResult: Boolean;
beginFLock.Acquire;tryGetDevMode(lDevMode);  //调用返回lDevMode一直为0 Result := False;lResult := FALSE;trylPDevMode := GlobalLock(lDevMode);//不能分配内存,lPDevMode 为nil.if Screen.ActiveForm <> nil thenlHandle := Screen.ActiveForm.HandleelselHandle := 0;if lPDevMode <> nil  then  //lPDevMode 为nil,不调用打印机属性设置lResult := (Winspool.DocumentProperties(lHandle, PrinterHandle, PChar(PrinterInfo.Device),lPDevMode^, lPDevMode^, DM_IN_BUFFER or DM_OUT_BUFFER or DM_IN_PROMPT) > 0);if lResult thenbeginSetDevMode(lDevMode);Result := True;end;GlobalUnlock(lDevMode);finallyGlobalFree(lDevMode);end;finallyFLock.Release;end;
end;
进而跟踪GetDevMode,找到RM_Printer.pas文件中GetDocumentProperties函数,代码段如下:
function TRMCustomPrinter.GetDocumentProperties: THandle;
varlStubDevMode: TDeviceMode;lPrinterInfo: TRMPrinterInfo;
beginFLock.Acquire;tryResult := 0;if FDevMode = 0 thenbeginlPrinterInfo := RMPrinters.PrinterInfo[FPrinterIndex];if lPrinterInfo = nil thenExit;FDevMode := GlobalAlloc(GHND,DocumentProperties(0, PrinterHandle, PChar(lPrinterInfo.Device), lStubDevMode, lStubDevMode, 0));//这里FDevMode 执行后始终为0,函数反馈也就为0.同时,导致以下IF内代码不会执行,不能获取打印机属性信息。if FDevMode <> 0 thenbeginFPDevMode := GlobalLock(FDevMode);if DocumentProperties(0, PrinterHandle, PChar(lPrinterInfo.Device), FPDevMode^, FPDevMode^, DM_OUT_BUFFER) >= 0 thenbeginFDefaultBin := FPDevMode^.dmDefaultSource;endelseFreeDevMode;end;end;Result := FDevMode;finallyFLock.Release;end;
end;

3、解决办法

更改GetDocumentProperties函数中的代码
DocumentProperties(0, PrinterHandle, PChar(lPrinterInfo.Device), lStubDevMode, lStubDevMode, 0)
DocumentProperties(0, PrinterHandle, PChar(lPrinterInfo.Device), nil, nil, 0)
  完整代码如下:
function TRMCustomPrinter.GetDocumentProperties: THandle;
var
//  lStubDevMode: TDeviceMode;lPrinterInfo: TRMPrinterInfo;
beginFLock.Acquire;tryResult := 0;if FDevMode = 0 thenbeginlPrinterInfo := RMPrinters.PrinterInfo[FPrinterIndex];if lPrinterInfo = nil thenExit;FDevMode := GlobalAlloc(GHND,DocumentProperties(0, PrinterHandle, PWideChar(lPrinterInfo.Device), nil, nil, 0));if FDevMode <> 0 thenbeginFPDevMode := GlobalLock(FDevMode);if DocumentProperties(0, PrinterHandle, PChar(lPrinterInfo.Device), FPDevMode^, FPDevMode^, DM_OUT_BUFFER) >= 0 thenbeginFDefaultBin := FPDevMode^.dmDefaultSource;endelseFreeDevMode;end;end;Result := FDevMode;finallyFLock.Release;end;
end;

ReportMachine不能打开打印机属性设置的解决方法相关推荐

  1. win7右键计算机管理参数错误,win7 64位旗舰版系统右键无法打开属性窗口的解决方法...

    有用户反馈,本想给自己的Win7系统电脑更换一个背景后,但是右键打开win7属性窗口的时候却发现怎么也打不开了,不知是什么原因,该怎样解决?其实,右键打开属性窗口的功能有很多,它并不是局限于背景的设置 ...

  2. word打印机显示服务器脱机,电脑中打开word文件时总显示打印机没有响应的解决方法...

    我们经常会使用word来编辑文档,不过近日有不少小伙伴在电脑中打开word文档的时候,却总是显示"打印机没有响应,但是程序可以在没有打印机信息的情况下继续运行,是否继续等待打印机响应?&qu ...

  3. win7系统提示无法保存打印机设置的解决方法

    win764位系统提示无法保存打印机设置的问题发生概率较高.怎样来处理win7系统提示无法保存打印机设置的问题,知道的人估计不多.本站针对win7系统提示无法保存打印机设置的情况总结了一些解决的方法. ...

  4. 计算机连接网络是飞行模式怎么办,网络设置只剩飞行模式怎么办_win10笔记本打开只有飞行模式的解决方法...

    最近有win10的用户反映,打开笔记本的时候发现没有网络,看一下网络连接界面,发现只有一个飞行模式,重启也无效果,那么应该怎么解决win10 64位系统的这个问题呢?下面小编就和大家分享win10笔记 ...

  5. 设置打印机属性打印课件的方法——一页显示9张PPT幻灯片

    设置打印机属性打印课件的方法 1)通常情况下打印课件(PPT)方法(如图一) 文件->打印->打印内容->讲义 设置打印内容为讲义,每页6张或9张,但是打印出的效果都不是很好,一页上 ...

  6. websocket没准备好如何解决_惠普打印机打印没反应如何解决 惠普打印机打印没反应解决方法【详解】...

    在我们的生活中经常会看到打印机的存在,它是电脑输出的一种设备,可以将电脑或者手机中的数据通过打印机打印出来.如今市面上的打印机品牌非常的多, 惠普打印机 就是其中一个很不错的品牌,可是在使用的过程中, ...

  7. win10无法访问xp计算机,XP系统访问Win10打印机被拒绝的解决方法

    打印机是办公室人员经常会用到的设备,为了方便多人使用都会将打印机设置共享,可是近日有xp系统用户在访问win10打印机的时候,却发现拒绝访问无法连接,该如何解决呢,现在系统城小编就给大家讲解一下XP系 ...

  8. win8无法共享我的计算机,Win8共享打印机拒绝访问的解决方法

    我们在共享打印机的时候,常常会遇到无法连接共享打印机出错的情况,并提示:"操作无法完成,拒绝访问".最近,使用Win8系统的用户,也遇到这样的情况,问遇到这样的问题我们要如何去解决 ...

  9. 网页 php pdf文件怎么打开是乱码,打开php文件乱码的解决方法

    打开php文件乱码的解决方法 发布时间:2021-02-14 11:45:35 来源:亿速云 阅读:94 作者:小新 小编给大家分享一下打开php文件乱码的解决方法,相信大部分人都还不怎么了解,因此分 ...

最新文章

  1. Warshall算法多源点之间最短路径的算法最短距离
  2. 2021年大数据Flink(二十五):Flink 状态管理
  3. 在archlinux上搭建twitter storm cluster
  4. linux下wifi编程(基于netlink和nl80211.h)
  5. 机房存在哪些安全隐患?需要排查哪些地方?
  6. java_advanced_review(3)补充:利用网络套接字实现类似qq 的控制台通讯
  7. gridview ashx实现数据更新_Python分析了香港26281套在售二手房数据,结果发现
  8. 贝叶斯网的R实现( Bayesian networks in R)bnlearn(3)
  9. 女性一辈子不结婚,会怎么样?
  10. mybatis 3.2.3 maven dependency pom.xml 配置
  11. Julia: save 与 @save
  12. Web Scraper入门
  13. Android 自定义歌词滚动
  14. 微信搜索引擎中索引的分布式演进
  15. android 定时器倒计时,Android CountDownTimer实现定时器和倒计时效果
  16. 笔记本酷睿i5 1135g7相当于什么水平?i5 1135g7性能怎么样
  17. PHP程序员的职业规划,走进PHP后端工程师的世界
  18. 基于C#的可编程仪器标准命令(SCPI)实践 (附源代码)
  19. 基于GA-BP神经网络的风电功率预测
  20. 有的歌声音大有的歌声音小_下载的歌曲声音小怎么办 怎么把歌曲声音变大

热门文章

  1. 基于yolov5实现FPS游戏自瞄,理论上通杀所有射击游戏
  2. 现代通信原理思维导图--第一章 信号
  3. 辰华宏命令(Macro Command)使用说明
  4. Glide加载GIF
  5. 对实例化需求方法的整理与思考
  6. navicat12破解版
  7. 西班牙语dele等级_西班牙语dele级别:C1 C2
  8. ip地址转换数字函数 iton_esp8266 inet_ntoa函数实现 ip地址转换为字符串 MAC地址转字符串...
  9. Android 题目动态存储+倒计时功能实现
  10. mysql权限模型子查询 casewhen子查询