1. 程式人生 > >ReportMachine不能開啟印表機屬性設定的解決方法

ReportMachine不能開啟印表機屬性設定的解決方法

ReportMachine不能開啟列印設定的解決方法

1、問題現象

在使用ReportMachine作為報表列印時,發現不能呼叫本機印表機屬性設定對話方塊,如下圖:

這裡寫圖片描述

 點選“屬性”按鈕後無反應,從而不能對印表機屬性進行設定。該問題同時也導致不能獲取印表機設定資訊。

2、問題原因

跟蹤程式碼發現點選“屬性”,會呼叫“PropertiesDlg”函式,RM_Printer.pas檔案中,程式碼如下:
function TRMPrinter.PropertiesDlg: Boolean;
var
    lDevMode: THandle;
    lPDevMode: PDeviceMode;
    lHandle: THandle;
    lResult: Boolean;
begin
FLock.Acquire; try GetDevMode(lDevMode); //呼叫返回lDevMode一直為0 Result := False; lResult := FALSE; try lPDevMode := GlobalLock(lDevMode);//不能分配記憶體,lPDevMode 為nil. if Screen.ActiveForm <> nil then lHandle := Screen.ActiveForm.Handle else
lHandle := 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 then begin SetDevMode(lDevMode); Result := True; end; GlobalUnlock(lDevMode); finally GlobalFree(lDevMode); end; finally FLock.Release; end; end;
進而跟蹤GetDevMode,找到RM_Printer.pas檔案中GetDocumentProperties函式,程式碼段如下:
function TRMCustomPrinter.GetDocumentProperties: THandle;
var
    lStubDevMode: TDeviceMode;
    lPrinterInfo: TRMPrinterInfo;
begin
    FLock.Acquire;
    try
        Result := 0;
        if FDevMode = 0 then
        begin
            lPrinterInfo := RMPrinters.PrinterInfo[FPrinterIndex];
            if lPrinterInfo = nil then
                Exit;

            FDevMode := GlobalAlloc(GHND,
                DocumentProperties(0, PrinterHandle, PChar(lPrinterInfo.Device), lStubDevMode, lStubDevMode, 0));
            //這裡FDevMode 執行後始終為0,函式反饋也就為0.同時,導致以下IF內程式碼不會執行,不能獲取印表機屬性資訊。

            if FDevMode <> 0 then
            begin
                FPDevMode := GlobalLock(FDevMode);
                if DocumentProperties(0, PrinterHandle, PChar(lPrinterInfo.Device), FPDevMode^, FPDevMode^, DM_OUT_BUFFER) >= 0 then
                begin
                    FDefaultBin := FPDevMode^.dmDefaultSource;
                end
                else
                    FreeDevMode;
            end;
        end;
        Result := FDevMode;
    finally
        FLock.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;
begin
    FLock.Acquire;
    try
        Result := 0;
        if FDevMode = 0 then
        begin
            lPrinterInfo := RMPrinters.PrinterInfo[FPrinterIndex];
            if lPrinterInfo = nil then
                Exit;

            FDevMode := GlobalAlloc(GHND,
                DocumentProperties(0, PrinterHandle, PWideChar(lPrinterInfo.Device), nil, nil, 0));

            if FDevMode <> 0 then
            begin
                FPDevMode := GlobalLock(FDevMode);
                if DocumentProperties(0, PrinterHandle, PChar(lPrinterInfo.Device), FPDevMode^, FPDevMode^, DM_OUT_BUFFER) >= 0 then
                begin
                    FDefaultBin := FPDevMode^.dmDefaultSource;
                end
                else
                    FreeDevMode;
            end;
        end;
        Result := FDevMode;
    finally
        FLock.Release;
    end;
end;

相關推薦

ReportMachine不能開啟印表機屬性設定解決方法

ReportMachine不能開啟列印設定的解決方法 1、問題現象 在使用ReportMachine作為報表列印時,發現不能呼叫本機印表機屬性設定對話方塊,如下圖: 點選“屬性”按鈕後無反應,從而不能對印表機屬性進行設定。該問題同時也導致不能獲

iOS11 開啟相簿上移問題解決方法

原因是app設定了: if (@available(iOS 11, *)) { UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; }

element-ui + el-dialog + Vue.component 註冊的富文字控制元件 第二次及以後開啟dialog出現問題解決方法

自定控制元件 新增屬性  v-if="dialogVisible" <el-dialog title="" :visible.sync="dialogVisible" :append-to-body="true"> <my-editor v-model="

VC++6.0檔案開啟不好使問題解決方法

問題描述: 解決方法: 1、前往https://pan.baidu.com/share/link?shareid=297965&uk=1527666514下載補丁程式 2、將檔案拷貝至VC++6.0根目錄資料夾中的Common\MSDev98\AddI

wdcp面板下wordpress開啟偽靜態404解決方法

建站面板由於換成了WDCP然後worpress設定偽靜態的時候,突然發現首頁能訪問,文章頁開啟404,經過各種查閱資料,整理了下解決方法; 1.手寫在後臺【Rewrite規則管理】新增規則wordpress.conf(這裡隨意命名,為了方便,我命名為WordPress)

JAVA以UTF-8編碼格式匯出CSV檔案,用office開啟產生亂碼的解決方法

一般java匯出為csv檔案程式碼如下 OutputStreamWriter osw = new OutputStreamWriter(resp.getOutputStream

GDAL開啟mdb檔案失敗解決方法(二)

上一篇http://blog.csdn.net/liminlu0314/article/details/53433014博文中說到,可以通過配置項來解決mdb檔案開啟失敗的問題。該問題主要是在64位的程式中會出現。仔細檢視gdal的程式碼,發現在原始碼中已經針對這個問題進行了修改,但是測試發現

GDAL開啟mdb檔案失敗解決方法

使用GDAL開啟mdb檔案時提示下面錯誤資訊: ERROR 1: Unable to initialize ODBC connection to DSN for DRIVER=Microsoft Access Driver (*.mdb);DBQ=C:\Users\SCRS-Minl

關於win10無法開啟.msi檔案的解決方法

一下只是我的一些建議和安裝.msi兩天的一些經驗,不一定有用。但是在一天半的倒騰之下結果可以開啟.msi檔案了。 一、可能是我將.msi檔案添加了一個右擊->以管理員身份執行。下面就來說一下怎麼設定: 1、Win+R,開啟執行,輸入regedit 2、開啟登

VC6新增或開啟檔案崩潰的解決方法

這個問題其實有人已經給出了很詳細的解決方法,通過下載一個filetool外掛解決。但是如果不想下載外掛,這裡可以給個簡單的新增檔案的方法。 方法一: 直接修改工程目錄下面的dsp檔案。dsp全稱De

Vue 做的專案在IE下面開啟一片空白解決方法

ie瀏覽器開啟報這個錯並且頁面空白: 原因:這是因為瀏覽器對於部分ES6語法識別不出來導致,所以我們要安裝一個外掛,把ES6語法轉換成IE瀏覽器可以識別的語法。 解決方法: 需要安裝 "babel-polyfill" 。 然後在入口檔案main.js引入  import "ba

Photoshop cs6中kuler和mini bridge開啟是空白的解決方法

kuler開啟空白的解決方法(此解決方法建立在你的編輯→首選項→增效工具已經勾選了載入面板和允許連結internet) 點選開啟連結這個連結裡面有詳細的步驟: 操作之前先把ps軟體關掉 然後下載連結中的CSXS kuler.zip,點選下載即可,然後下完了解壓安裝

php json_encode不支援物件私有屬性解決方法

本文介紹php json_encode不支援物件私有屬性的解決方法,json_encode可以把物件轉為json格式,使用json_decode可以還原為物件。 但如果物件內含有私有屬性,執行json

10.11無法開啟Xcode6.4的解決方法

前言 mac升級到10.11版本並安裝Xcode7.0Beta之後,Dock中的Xcode6.3圖示上出現一個禁止符號,開啟提示到App store更新最新版本,更新到6.4之後問題依舊,還是提示更新版本,但6.4已是最新版本,整個陷入死迴圈。只好先用Xcode7.0Bet

csv用excel開啟後亂碼的解決方法

一、問題描述 開啟excel開啟csv表格亂碼: 發現中文亂碼了。 二、解決辦法 發現右鍵記事本開啟卻能正常顯示 這個原因是因為csv檔案沒有預設使用utf-8,首先下載一個notepad++,安裝好之後右鍵使用notepad++開啟 在

無法直接在IE中開啟PDF檔案的解決方法

從Google、Edge等瀏覽器中可以直接開啟PDF檔案,但是在IE中提示下載PDF檔案,通過下面的方法設定IE8後直接在瀏覽器中開啟PDF檔案。 IE8->工具->管理載入項,開啟如下設定介面: 啟用“Adobe PDF Reader”項。

關於cmd無法開啟mysql服務的解決方法

安裝好mysql後使用cmd開啟服務出現如下的介面。 考慮到可能是許可權過低的緣故,於是以管理員許可權開啟,沒有解決問題。 查閱資料看到的都是差不多的方法複製黏貼,試過其中的幾個也沒有成功,終

JAVA以UTF-8匯出CSV檔案,用excel開啟產生亂碼的解決方法

先上一段程式碼(上好的程式碼,多年陳釀) OutputStreamWriter osw = new OutputStreamWriter(resp.getOutputStream(), "UTF-8"); // 要輸出的內容 result = (String)co

2003_由於不可識別問題_windows無法顯示windows防火牆設定解決方法

一定是中毒了,請查殺病毒和流氓軟體。如果防毒之後仍然如此,那就試試這種方法: 防火牆項新增到登錄檔 如果正確修改登錄檔通過使用登錄檔編輯器或者通過使用其他方法 警告 可能發生 Serious 問題。 這些問題可能需要重新安裝作業系統。 Microsoft 不能保證可以解決這

“friend宣告友元函式,友元函式卻依舊無法訪問該類的私有屬性”的解決方法

“friend宣告友元函式,友元函式卻依舊無法訪問該類的私有屬性”的解決 一次C++作業題, 搞了很久弄明白了, 雖然成功了, 但VS2015依舊有紅線提示錯誤, 不過不影響編譯、執行, 這似乎是VS