關於點矩陣印表機的問題 |
尚未結案
|
kenlee
一般會員 發表:10 回覆:8 積分:3 註冊:2004-04-29 發送簡訊給我 |
我目前使用一個點矩陣的印表機(Fujitsu DL3800 Pro),將其接在LPT1,其目的是當程式軟體收到即訊息時,能立刻將其輸出在連續報表紙上,但問題是:如果用Printer()->Canvas的方式列印,只要送出一筆訊息就會捲動一頁,但容易計算其輸出文字的大小(圖形模式列印);相對的,若以CreateFile( "LPT1...)及WriteFile方式輸出到印表機上,則不能調整文字的大小(純文字列印模式),請教各位,有沒有方法可以以圖形模式列印,但又可以在每一次列印後,不要自動捲動跳頁的方法?在下的作業系統為Win2000...
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
kenlee:我的第一份BCB報表是使用RechEdit,也是使用 Printer()->Canvas的方式列印,並沒有你所謂只要送出一筆訊息就會捲動一頁 。我不清楚你列印的方式;我Post我早期的方式,BCB3時代產物請勿見笑! AnsiString S; Screen->Cursor=crHourGlass; if (PrintDialog1->Execute()) { int XPos=30; // 頁左空大小**頁右用不到 int pTop=2; // 空距大小 TPrinter *pPrinter=Printer(); pPrinter->BeginDoc(); // 準備開始 pPrinter->Canvas->Font=RechEdit1->Font; pPrinter->Canvas->Font->Size=12; pPrinter->Canvas->Font->Color=clBlack; int pageline=0; for (int i=0;iAndy Chang
------
Andy Chang |
kenlee
一般會員 發表:10 回覆:8 積分:3 註冊:2004-04-29 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
|
kenlee
一般會員 發表:10 回覆:8 積分:3 註冊:2004-04-29 發送簡訊給我 |
我測試的程式碼和你的相同,內容如下:
void __fastcall TForm1::Button2Click(TObject *Sender) { AnsiString S; Screen->Cursor=crHourGlass; if (PrintDialog1->Execute()) { int XPos=30; // 頁左空大小**頁右用不到 int pTop=2; // 空距大小 TPrinter *pPrinter=Printer(); pPrinter->BeginDoc(); // 準備開始 pPrinter->Canvas->Font=RichEdit1->Font; pPrinter->Canvas->Font->Size=12; pPrinter->Canvas->Font->Color=clBlack; int pageline=0; for (int i=0;i但輸出就是會自動跳頁,即使把下列這些註解掉也是一樣 if (i!=RichEdit1->Lines->Count) pPrinter->NewPage(); // 跳頁 |
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
kenlee:很怪的現象?那檢查一下列表機吧! 取得和設置當前紙張類型 void __fastcall TForm1::Button2Click(TObject *Sender) { WORD wPaper; char Device[65]; char Driver[65]; char APort[65]; UINT DeviceMode; DEVMODE* pDevMode; Printer()->GetPrinter(Device, Driver, APort, DeviceMode); pDevMode = (DEVMODE*)GlobalLock((HANDLE)DeviceMode); //pDevMode->dmPaperSize 就是當前紙張類型大小 wPaper = pDevMode->dmPaperSize; pDevMode->dmPaperSize = DMPAPER_A4; //改為 A4 GlobalUnlock((HANDLE)DeviceMode); //重新設定列表機參數 Printer()->SetPrinter(Device, Driver, APort, DeviceMode); } 紙張類型大小請見:wingdi.h 我突然想到一個狀況,你是 其目的是當程式軟體收到即訊息時,能立刻將其輸出在連續報表紙上 請問你是否將資料直接放置RechEdit上就列印出去?Andy Chang
------
Andy Chang |
kenlee
一般會員 發表:10 回覆:8 積分:3 註冊:2004-04-29 發送簡訊給我 |
我試過即使程式只有:
pPrinter->BeginDoc(); Printer()->Canvas->TextOut(0, 0, "測試列印用單文宇訊息"); pPrinter->EndDoc();也會自動換頁,(應該是EndDoc的原因,但又不能省略..) 感謝您的熱心回應,剛才再搜尋其它的文章,發現有人有另一程作法,這方法似乎可以透過網路到印表機來列印單行,原本我的作法是用開 class="code"> if (PrintMsgList->Count>0) //有印表機訊息 { //列印參數設定 hPrinter = CreateFile( "LPT1", GENERIC_READ|GENERIC_WRITE, 0, // exclusive access NULL, // no security attrs OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (hPrinter!=NULL) //無預設印表機 { str = ""; try{ str = PrintMsgList->Strings[0]; PrintMsgList->Delete(0); }catch(...) {;} //將資料寫至LPT1埠 try { if (str!="") WriteFile(hPrinter, (str "\n").c_str(), str.Length() 1, &PrintedLength, NULL); } catch(...) {;} CloseHandle(hPrinter); } } |
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
kenlee:跟我想的一樣,你動用到: TPrinter會跳頁的部分為NewPage(); 及EndDoc();。 先Post一篇與WriteFile有關文件; 來源我忘了對不起!因為我把它收到我記錄裡。 直接控制向印表機輸出的代碼: DWORD Result; HANDLE hPort1 = CreateFile("LPT1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if(hPort1==INVALID_HANDLE_VALUE) ShowMessage("不能打開LPT1埠,無法列印!"); else WriteFile( hPort1, "Lello Word", 10,&Result,NULL); CloseHandle(hPort1); Enter和換行印表機可以處理的,此外就是還有瞭解印表機的控制碼, 每一個印表機都是不一樣的,比如列印完了送紙,列印之前退紙等操作也是需要代碼控制。 如果不是使用的針打,採用TPrinter和直接輸出的速度差不多的。 ------------------------------------------------------------------- 其實你可以使用TPrinter但使用方式要改變; 於.H檔 private: // User declarations 或 public: // User declarations TPrinter *pPrinter; // 宣告 .CPP檔 void __fastcall TForm1::FormCreate(TObject *Sender) { pPrinter=Printer(); } // 開啟列表機,準備列印 void __fastcall TForm1::Button1Click(TObject *Sender) { if (PrintDialog1->Execute()) { int XPos=30; // 頁左空大小**頁右用不到 int pTop=2; // 空距大小 pPrinter->BeginDoc(); // 準備開始 pPrinter->Canvas->Font=RichEdit1->Font; pPrinter->Canvas->Font->Size=12; pPrinter->Canvas->Font->Color=clBlack; } } // 列印 void __fastcall TForm1::Button2Click(TObject *Sender) { Printer()->Canvas->TextOut(XPos, (pTop Printer()->Canvas->TextHeight('A'))*pageline, "測試列印用單文宇訊息"); } // 結束列印 void __fastcall TForm1::Button3Click(TObject *Sender) { pPrinter->EndDoc(); // 結束 } 有關跳頁及跳行只要加一些變數判斷即可。 請參考!Andy Chang
------
Andy Chang |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |