全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3324
推到 Plurk!
推到 Facebook!

關於點矩陣印表機的問題

尚未結案
kenlee
一般會員


發表:10
回覆:8
積分:3
註冊:2004-04-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-20 19:48:56 IP:61.219.xxx.xxx 未訂閱
我目前使用一個點矩陣的印表機(Fujitsu DL3800 Pro),將其接在LPT1,其目的是當程式軟體收到即訊息時,能立刻將其輸出在連續報表紙上,但問題是:如果用Printer()->Canvas的方式列印,只要送出一筆訊息就會捲動一頁,但容易計算其輸出文字的大小(圖形模式列印);相對的,若以CreateFile( "LPT1...)及WriteFile方式輸出到印表機上,則不能調整文字的大小(純文字列印模式),請教各位,有沒有方法可以以圖形模式列印,但又可以在每一次列印後,不要自動捲動跳頁的方法?在下的作業系統為Win2000...
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-20 23:44:23 IP:221.169.xxx.xxx 未訂閱
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;iLines->Count;i  )  {
            S=RechEdit1->Lines->Strings[i].Trim();
            Printer()->Canvas->TextOut(XPos,
                   (pTop Printer()->Canvas->TextHeight(S))*pageline,
                   S.c_str());
            pageline  ;
            if (S=="<續下頁>" || S=="<結  束>" )   {
                if (i!=RechEdit1->Lines->Count)
                     pPrinter->NewPage(); // 跳頁
                pageline=0;
            }
        }
        pPrinter->EndDoc();  // 結束
    }
    Screen->Cursor=crDefault;    請參考!也希望能知道了解你的方式!?
Andy Chang
------
Andy Chang
kenlee
一般會員


發表:10
回覆:8
積分:3
註冊:2004-04-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-22 19:18:14 IP:61.219.xxx.xxx 未訂閱
andychang1690 您好! 我依照你的程式碼作測試,結果列印後還是會自動跳頁,不知是不是印表機的設定,還是那個步驟有問題?不知還有何方式可試?
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-22 19:50:33 IP:221.169.xxx.xxx 未訂閱
kenlee:會影響列表機的跳頁,除了列表機的設定外,但我依你第一次的問題 我會排除掉。 TPrinter會跳頁的部分為NewPage(); 及EndDoc();。 列印字碼會影響跳頁為送出ASCII(12);玩過倚天的人應該不陌生。 能否請你Post你的程式! Andy Chang
------
Andy Chang
kenlee
一般會員


發表:10
回覆:8
積分:3
註冊:2004-04-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-26 10:59:32 IP:61.219.xxx.xxx 未訂閱
我測試的程式碼和你的相同,內容如下:
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;iLines->Count;i  )
        {
            S=RichEdit1->Lines->Strings[i].Trim();
            Printer()->Canvas->TextOut(XPos,
                   (pTop Printer()->Canvas->TextHeight(S))*pageline,
                   S.c_str());
            pageline  ;
            if (S=="<續下頁>" || S=="<結  束>" )
            {
                if (i!=RichEdit1->Lines->Count)
                     pPrinter->NewPage(); // 跳頁
                pageline=0;
            }
        }
        pPrinter->EndDoc();  // 結束
    }
    Screen->Cursor=crDefault;
}
但輸出就是會自動跳頁,即使把下列這些註解掉也是一樣
if (i!=RichEdit1->Lines->Count)
    pPrinter->NewPage(); // 跳頁
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-27 01:39:35 IP:221.169.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-27 15:03:47 IP:61.219.xxx.xxx 未訂閱
我試過即使程式只有:
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-27 17:40:44 IP:221.169.xxx.xxx 未訂閱
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
系統時間:2024-05-02 5:48:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!