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