線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2656
推到 Plurk!
推到 Facebook!

可否有大大幫我翻譯成DELPHI

尚未結案
spencerkuo
一般會員


發表:21
回覆:34
積分:11
註冊:2003-08-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-05 14:25:23 IP:61.64.xxx.xxx 未訂閱
可否有大大幫我翻譯成DELPHI,因小第我不懂得寫VB 請幫幫忙 謝謝 以下是設定使用聯流的7000型號的熱感應式標籤機所用的VB語言 Type DOCINFO pDocName As String pOutputFile As String pDatatype As String End Type Declare Function ClosePrinter Lib "winspool.drv" (ByVal _hPrinter As Long) As Long Declare Function EndDocPrinter Lib "winspool.drv" (ByVal _hPrinter As Long) As Long Declare Function EndPagePrinter Lib "winspool.drv" (ByVal _hPrinter As Long) As Long Declare Function OpenPrinter Lib "winspool.drv" Alias _"OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, _ByVal pDefault As Long) As Long Declare Function StartDocPrinter Lib "winspool.drv" Alias _"StartDocPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _pDocInfo As DOCINFO) As Long Declare Function StartPagePrinter Lib "winspool.drv" (ByVal _hPrinter As Long) As Long Declare Function WritePrinter Lib "winspool.drv" (ByVal _hPrinter As Long, pBuf As Any, ByVal cdBuf As Long, _pcWritten As Long) As Long Public Function Send2Driver(ByVal mDATA As String, ByVal mDriverName As String, Optional ByVal mPROMPT As String = "列印測試") As Integer 'mDATA 要列印的資料 'mDriverName 印表機驅動程式名稱(若查無該名稱就傳回-2) 'mPROMPT 顯示在Printer Spool 的名稱 '列印OK就傳回0, 有錯誤就傳回小於零的值 On Error GoTo ERR Dim lhPrinter As Long Dim Ret As Long Dim lpcWritten As Long Dim lDoc As Long Dim MyDocInfo As DOCINFO Send2Driver = -1 Ret = OpenPrinter(mDriverName, lhPrinter, 0) If Ret = 0 Then Send2Driver = -2 '查無該 Printer Driver Name Exit Function End If MyDocInfo.pDocName = mPROMPT MyDocInfo.pOutputFile = vbNullString MyDocInfo.pDatatype = vbNullString lDoc = StartDocPrinter(lhPrinter, 1, MyDocInfo) Call StartPagePrinter(lhPrinter) Ret = WritePrinter(lhPrinter, ByVal mDATA, _LenB(StrConv(mDATA, vbFromUnicode)), lpcWritten) Ret = EndPagePrinter(lhPrinter) Ret = EndDocPrinter(lhPrinter) Ret = ClosePrinter(lhPrinter) Send2Driver = 0 Exit Function ERR: ERR.Clear End Function 用法: 此函數會以純文字模式傳送資料到印表機, 你必須傳送印表機接受的控制命令 If Send2Driver("中華民國" & Chr(13) & Chr(10) & "世界大同" & Chr(13) & Chr(10), "\\SERVERNAME\LEXMARK") = 0 Then Print OK Else Print Error End If
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-05 17:30:52 IP:202.39.xxx.xxx 未訂閱
uses Winspool; // API 部份 uses Winspool 這個 unit 即可    type DOCINFO = record
    pDocName: String;
    pOutputFile: String;
    pDatatype: String;
  End;    function Send2Driver(mDATA, mDriverName: string;
  mPROMPT: String = '列印測試'): Integer;
//'mDATA 要列印的資料
//'mDriverName 印表機驅動程式名稱(若查無該名稱就傳回-2)
//'mPROMPT 顯示在Printer Spool 的名稱
//'列印OK就傳回0, 有錯誤就傳回小於零的值
var
  lhPrinter: THandle;
  lpcWritten: Cardinal;
  MyDocInfo: DOCINFO;    begin
  Send2Driver := -1;
  try
    if OpenPrinter(PChar(mDriverName), lhPrinter, nil) then begin
      Send2Driver := -2; // 查無該 Printer Driver Name
      Exit;
    End;
    MyDocInfo.pDocName := mPROMPT;
    MyDocInfo.pOutputFile := '';
    MyDocInfo.pDatatype := '';
    StartDocPrinter(lhPrinter, 1, @MyDocInfo);
    StartPagePrinter(lhPrinter);        WritePrinter(lhPrinter,
                 PChar(mDATA),
                 Length(mDATA),
                 lpcWritten);        EndPagePrinter(lhPrinter);
    EndDocPrinter(lhPrinter);
    ClosePrinter(lhPrinter);
    Send2Driver := 0;
  except
  end;
End;
試試看. --- 歡迎光臨 >
spencerkuo
一般會員


發表:21
回覆:34
積分:11
註冊:2003-08-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-05 21:22:03 IP:61.64.xxx.xxx 未訂閱
引言:
uses Winspool; // API 部份 uses Winspool 這個 unit 即可    type DOCINFO = record
    pDocName: String;
    pOutputFile: String;
    pDatatype: String;
  End;    function Send2Driver(mDATA, mDriverName: string;
  mPROMPT: String = '列印測試'): Integer;
//'mDATA 要列印的資料
//'mDriverName 印表機驅動程式名稱(若查無該名稱就傳回-2)
//'mPROMPT 顯示在Printer Spool 的名稱
//'列印OK就傳回0, 有錯誤就傳回小於零的值
var
  lhPrinter: THandle;
  lpcWritten: Cardinal;
  MyDocInfo: DOCINFO;    begin
  Send2Driver := -1;
  try
    if OpenPrinter(PChar(mDriverName), lhPrinter, nil) then begin
      Send2Driver := -2; // 查無該 Printer Driver Name
      Exit;
    End;
    MyDocInfo.pDocName := mPROMPT;
    MyDocInfo.pOutputFile := '';
    MyDocInfo.pDatatype := '';
    StartDocPrinter(lhPrinter, 1, @MyDocInfo);
    StartPagePrinter(lhPrinter);        WritePrinter(lhPrinter,
                 PChar(mDATA),
                 Length(mDATA),
                 lpcWritten);        EndPagePrinter(lhPrinter);
    EndDocPrinter(lhPrinter);
    ClosePrinter(lhPrinter);
    Send2Driver := 0;
  except
  end;
End;
試試看. --- 歡迎光臨 > < face="Verdana, Arial, Helvetica"> 太感謝了,感激不盡,不知怎麼報答 謝謝 我明天拿到我爸的餐廳試試看 希望可以 我爸的餐廳開在紗帽山,新開的,叫巴登巴登 目前還沒有開幕,10月11號才開幕 在紗帽谷的上面一點點 ^^ 發表人 - spencerkuo 於 2003/10/05 22:06:53
spencerkuo
一般會員


發表:21
回覆:34
積分:11
註冊:2003-08-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-07 11:28:00 IP:61.64.xxx.xxx 未訂閱
引言:
引言:
uses Winspool; // API 部份 uses Winspool 這個 unit 即可    type DOCINFO = record
    pDocName: String;
    pOutputFile: String;
    pDatatype: String;
  End;    function Send2Driver(mDATA, mDriverName: string;
  mPROMPT: String = '列印測試'): Integer;
//'mDATA 要列印的資料
//'mDriverName 印表機驅動程式名稱(若查無該名稱就傳回-2)
//'mPROMPT 顯示在Printer Spool 的名稱
//'列印OK就傳回0, 有錯誤就傳回小於零的值
var
  lhPrinter: THandle;
  lpcWritten: Cardinal;
  MyDocInfo: DOCINFO;    begin
  Send2Driver := -1;
  try
    if OpenPrinter(PChar(mDriverName), lhPrinter, nil) then begin
      Send2Driver := -2; // 查無該 Printer Driver Name
      Exit;
    End;
    MyDocInfo.pDocName := mPROMPT;
    MyDocInfo.pOutputFile := '';
    MyDocInfo.pDatatype := '';
    StartDocPrinter(lhPrinter, 1, @MyDocInfo);
    StartPagePrinter(lhPrinter);        WritePrinter(lhPrinter,
                 PChar(mDATA),
                 Length(mDATA),
                 lpcWritten);        EndPagePrinter(lhPrinter);
    EndDocPrinter(lhPrinter);
    ClosePrinter(lhPrinter);
    Send2Driver := 0;
  except
  end;
End;
試試看. --- 歡迎光臨 > < face="Verdana, Arial, Helvetica"> 太感謝了,感激不盡,不知怎麼報答 謝謝 我明天拿到我爸的餐廳試試看 希望可以 我爸的餐廳開在紗帽山,新開的,叫巴登巴登 目前還沒有開幕,10月11號才開幕 在紗帽谷的上面一點點 ^^ 發表人 - spencerkuo 於 2003/10/05 22:06:53
我昨天試過了,這段程式碼不能用耶, pos機的標籤印表機設到印表機伺服器 用上面的程式碼來列印,說print ok 但是標籤印表機無反應,在window上也沒有看到任何的doc在列印 為什麼呢,還是有更好的方法來解決這問題呢??
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-07 12:32:47 IP:202.39.xxx.xxx 未訂閱
uses Winspool; // API 部份 uses Winspool 這個 unit 即可    type DOCINFO = record
    pDocName: String;
    pOutputFile: String;
    pDatatype: String;
  End;    function Send2Driver(mDATA, mDriverName: string;
  mPROMPT: String = '列印測試'): Integer;
//'mDATA 要列印的資料
//'mDriverName 印表機驅動程式名稱(若查無該名稱就傳回-2)
//'mPROMPT 顯示在Printer Spool 的名稱
//'列印OK就傳回0, 有錯誤就傳回小於零的值
var
  lhPrinter: THandle;
  lpcWritten: Cardinal;
  MyDocInfo: DOCINFO;    begin
  Send2Driver := -1;
  try
    try
      if OpenPrinter(PChar(mDriverName), lhPrinter, nil) then begin
        Send2Driver := -2; // 查無該 Printer Driver Name
        Exit;
      End;
      MyDocInfo.pDocName := mPROMPT;
      MyDocInfo.pOutputFile := '';
      MyDocInfo.pDatatype := '';
      if StartDocPrinter(lhPrinter, 1, @MyDocInfo) = 0 then begin
        //ShowMessage(SysErrorMessage(GetLastError));
        Send2Driver := -3;
        Exit;
      end;
      if StartPagePrinter(lhPrinter) = 0 then begin
        //ShowMessage(SysErrorMessage(GetLastError));
        Send2Driver := -4;
        Exit;
      end;          if WritePrinter(lhPrinter,
                      PChar(mDATA),
                      Length(mDATA),
                      lpcWritten) = 0 then begin
        //ShowMessage(SysErrorMessage(GetLastError));
        Send2Driver := -5;
        Exit;
      end;          if EndPagePrinter(lhPrinter) = 0 then begin
        //ShowMessage(SysErrorMessage(GetLastError));
        Send2Driver := -6;
        Exit;
      end;          if EndDocPrinter(lhPrinter) = 0 then begin
        //ShowMessage(SysErrorMessage(GetLastError));
        Send2Driver := -7;
        Exit;
      end;
    finally
      ClosePrinter(lhPrinter);
    end;
    Send2Driver := 0;
  except
  end;
End;
--- 歡迎光臨 KTop 研究院
spencerkuo
一般會員


發表:21
回覆:34
積分:11
註冊:2003-08-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-07 21:51:22 IP:61.64.xxx.xxx 未訂閱
引言:
uses Winspool; // API 部份 uses Winspool 這個 unit 即可    type DOCINFO = record
    pDocName: String;
    pOutputFile: String;
    pDatatype: String;
  End;    function Send2Driver(mDATA, mDriverName: string;
  mPROMPT: String = '列印測試'): Integer;
//'mDATA 要列印的資料
//'mDriverName 印表機驅動程式名稱(若查無該名稱就傳回-2)
//'mPROMPT 顯示在Printer Spool 的名稱
//'列印OK就傳回0, 有錯誤就傳回小於零的值
var
  lhPrinter: THandle;
  lpcWritten: Cardinal;
  MyDocInfo: DOCINFO;    begin
  Send2Driver := -1;
  try
    try
      if OpenPrinter(PChar(mDriverName), lhPrinter, nil) then begin
        Send2Driver := -2; // 查無該 Printer Driver Name
        Exit;
      End;
      MyDocInfo.pDocName := mPROMPT;
      MyDocInfo.pOutputFile := '';
      MyDocInfo.pDatatype := '';
      if StartDocPrinter(lhPrinter, 1, @MyDocInfo) = 0 then begin
        //ShowMessage(SysErrorMessage(GetLastError));
        Send2Driver := -3;
        Exit;
      end;
      if StartPagePrinter(lhPrinter) = 0 then begin
        //ShowMessage(SysErrorMessage(GetLastError));
        Send2Driver := -4;
        Exit;
      end;          if WritePrinter(lhPrinter,
                      PChar(mDATA),
                      Length(mDATA),
                      lpcWritten) = 0 then begin
        //ShowMessage(SysErrorMessage(GetLastError));
        Send2Driver := -5;
        Exit;
      end;          if EndPagePrinter(lhPrinter) = 0 then begin
        //ShowMessage(SysErrorMessage(GetLastError));
        Send2Driver := -6;
        Exit;
      end;          if EndDocPrinter(lhPrinter) = 0 then begin
        //ShowMessage(SysErrorMessage(GetLastError));
        Send2Driver := -7;
        Exit;
      end;
    finally
      ClosePrinter(lhPrinter);
    end;
    Send2Driver := 0;
  except
  end;
End;
--- 歡迎光臨 KTop 研究院 < face="Verdana, Arial, Helvetica"> 謝謝 雖然還是不行 但是我把我的做法放上來 雖然不是很正統的做法 但是還是可以解決 //使用 printers unit //先把要用的寫到memo,然後一行一行的送到印表機伺服器 with Printer do begin BeginDoc; Canvas.Font.Size := 18; for j := 0 to Memo1.Lines.Count -1 do Canvas.TextOut(10, j * Canvas.TextHeight(Memo1.Lines.Strings[j]) , Memo1.Lines[j]); EndDoc; end; 在三的感謝hagar的幫忙 你的程式碼也讓我學到了不少
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-09 17:55:49 IP:211.96.xxx.xxx 未訂閱
我最近這幾天就被一台台灣製的熱感式印表機給氣死,名字叫TYSSO的RPR-058P,用附的WINDOWS DRIVER來印,怎麼印就怎麼怪,第一張印一半,第二張就不印了,非得要把ONLINE鍵關了又開才印~~~然後就更奇怪了~~~找了一堆相容ESC/POS指令集的印表機驅動程式來裝,還是不行,氣到~~~直接寫ESC/POS控制碼文件直接輸出到LPT1,居然成功了,害我白頭髮多了幾百根.......    我先用主程式把我要印的東東寫成文字檔,然後再執行的程式,參數就是我要印的文字檔,這是我的習慣,至少印表機變,主程式不用變,只要變這支PRINTER.EXE就可以了~    以下的範例是直接以文字權式輸出,需要印表機有附中文字型才行!如果沒有,那就要用點陣圖模式列印,那好複雜,我有寫,容後再述    不用ASSIGNPRN的原因就是因為ASSIGNPRN要安裝驅動程式,ASSIGNFILE( LPT1)不用,真是怪怪    
program Printer2;    USES WINDOWS;    var
    title ,caption,content,pf : string ;
    prnf,POSX: TEXTFILE;
    x: integer;
begin
   pf:=PARAMSTR(1);
   X:=0;
   WHILE X=0 DO BEGIN  // 測試印表機是不是被人佔用了~
      TRY
         SLEEP(100);
         assignfile(posx,'LPT1');
         REWRITE(POSX);
      FINALLY
         CLOSEFILE(POSX);
         X:=1;
      END;
   END;       TRY
      assignfile(prnf,pf '.prn');
   finally
         caption:='我家咖啡館';
         title:='收據';
         reset(prnf);             AssignFILE(POSX,'LPT1');
         Rewrite(POSX);
         Writeln(POSX, #27#51#0);
         Writeln(POSX, #27#33#30);
         writeln(posx,caption);
         writeln(posx,title);
         Writeln(POSX, #27#33#0);             content:='x';
         x:=0;
         while not eof(prnf) do begin
               readln(prnf,content);
               if (x>1) and (content<>'') then
                  Writeln(POSX, content);
               inc(x);
         end;
         Writeln(POSX, #27#10);
         Writeln(POSX, #27#10);
         Writeln(POSX, #27#10);
         Writeln(POSX, #27#10);
         Writeln(POSX, #27#64);
         Writeln(POSX, #27 'p' #0 #60 #255);  //  打開錢箱的指令
         CloseFILE(POSX);
         closefile(prnf);
         deletefile(pchar(pf '.prn'));
   END;
end.    
我不懂,不懂,不懂....所以我才來ktop學工夫
pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-11-13 11:33:32 IP:211.75.xxx.xxx 未訂閱
引言: 我最近這幾天就被一台台灣製的熱感式印表機給氣死,名字叫TYSSO的RPR-058P,用附的WINDOWS DRIVER來印,怎麼印就怎麼怪,第一張印一半,第二張就不印了,非得要把ONLINE鍵關了又開才印~~~然後就更奇怪了~~~找了一堆相容ESC/POS指令集的印表機驅動程式來裝,還是不行,氣到~~~直接寫ESC/POS控制碼文件直接輸出到LPT1,居然成功了,害我白頭髮多了幾百根....... 我先用主程式把我要印的東東寫成文字檔,然後再執行的程式,參數就是我要印的文字檔,這是我的習慣,至少印表機變,主程式不用變,只要變這支PRINTER.EXE就可以了~ 以下的範例是直接以文字權式輸出,需要印表機有附中文字型才行!如果沒有,那就要用點陣圖模式列印,那好複雜,我有寫,容後再述 不用ASSIGNPRN的原因就是因為ASSIGNPRN要安裝驅動程式,ASSIGNFILE( LPT1)不用,真是怪怪
program Printer2;    USES WINDOWS;    var
    title ,caption,content,pf : string ;
    prnf,POSX: TEXTFILE;
    x: integer;
begin
   pf:=PARAMSTR(1);
   X:=0;
   WHILE X=0 DO BEGIN  // 測試印表機是不是被人佔用了~
      TRY
         SLEEP(100);
         assignfile(posx,'LPT1');
         REWRITE(POSX);
      FINALLY
         CLOSEFILE(POSX);
         X:=1;
      END;
   END;       TRY
      assignfile(prnf,pf '.prn');
   finally
         caption:='我家咖啡館';
         title:='收據';
         reset(prnf);             AssignFILE(POSX,'LPT1');
         Rewrite(POSX);
         Writeln(POSX, #27#51#0);
         Writeln(POSX, #27#33#30);
         writeln(posx,caption);
         writeln(posx,title);
         Writeln(POSX, #27#33#0);             content:='x';
         x:=0;
         while not eof(prnf) do begin
               readln(prnf,content);
               if (x>1) and (content<>'') then
                  Writeln(POSX, content);
               inc(x);
         end;
         Writeln(POSX, #27#10);
         Writeln(POSX, #27#10);
         Writeln(POSX, #27#10);
         Writeln(POSX, #27#10);
         Writeln(POSX, #27#64);
         Writeln(POSX, #27 'p' #0 #60 #255);  //  打開錢箱的指令
         CloseFILE(POSX);
         closefile(prnf);
         deletefile(pchar(pf '.prn'));
   END;
end.    
我不懂,不懂,不懂....所以我才來ktop學工夫
請問,要是不確定預設印表機的列印連接埠的話,該怎麼抓呢? 我到控制台去看,若是本機印表機,會在其中一個連接埠前面打ˇ, 可是網路印表機的話卻沒有。假使將一台網路印表機設為預設印表機, 是否他的連接埠也是LPT1??
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-11-14 14:52:51 IP:211.96.xxx.xxx 未訂閱
執行 net use lpt1 \\aserver\epsonx 這樣也行~~~試看看 這是為了一些pos印表機沒帶驅動程式的權宜之計,並不是每台印表機都需要這樣玩~~~~ 我懂的不多,懂的也不盡然是最佳的寫法,但求我懂的東西,能在大家的討論中,愈辯愈明~
AB
高階會員


發表:166
回覆:262
積分:125
註冊:2003-08-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-11-14 15:49:17 IP:61.221.xxx.xxx 未訂閱
japhenchen 兄 請問一下 你那熱感應印表機 有內建 中文字型嗎 哈哈 庵沒看清楚 多問了 答應早已寫了 3q 喝喝 發表人 - ab 於 2003/11/14 15:51:18
pprayer
高階會員


發表:35
回覆:185
積分:174
註冊:2002-03-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-11-24 10:40:44 IP:211.75.xxx.xxx 未訂閱
引言: 執行 net use lpt1 \\aserver\epsonx 這樣也行~~~試看看 這是為了一些pos印表機沒帶驅動程式的權宜之計,並不是每台印表機都需要這樣玩~~~~ 我懂的不多,懂的也不盡然是最佳的寫法,但求我懂的東西,能在大家的討論中,愈辯愈明~
感謝感謝。另外還有個問題,我有段是這樣寫的 AssignPrn(fPrinter); Rewrite(fPrinter); Writeln(fPrinter,Char(27) Char(85) Char(48));//雙向列印 不過印表機(點陣)大概是把command當成文件列印出來了。 所以每份文件最前頭都有個U0,且也沒有雙向列印。 不知道是哪裡弄錯了?
系統時間:2024-04-27 11:39:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!