在REALBasic 環境下使用ESC/POS Command 直接輸出至POS 印表機, 最簡單的方法是購買 MonkeyBread MBS Real Studio Win Plugin, 下面是筆者的使用範例 :
http://www.monkeybreadsoftware.net/plugins-mbsrealstudiowinplugin.shtmlPrivate Sub PrintReceipt(optional tmpOpenDrawer as boolean=false)
  dim w as new WindowsAddPrintJobMBS
  dim tmpMaxColumnWidth as integer
  dim intY as integer
  
  if gintOperateMode=1 then
    gintCurrReceiptType=0
  else
    gintCurrReceiptType=1
  end if
  
  if pintFormMode=3 then
    gstrposdocname=lblQryMain(2).Caption
  else
    gstrposdocname=lblMain(2).Caption
  end if
  
  if not w.OpenPrinter(gstrPOSPrinter) then
    'MsgBox "OpenPrinter failed. Is the printer name correct in the source code?"
    call winMessage.ShowMsg(1,31)
    Return
  end if
  
  if not w.StartDocPrinter(gstrPOSDocName, w.kDataFormatRAW) then
    call winMessage.ShowMsg(1,32)
    'MsgBox "StartDocPrinter failed."
    Return
  end if
  
  
  if pintFormMode=3 then
    garyReceiptHeader(1,0)=ConvertEncoding(lblQryMain(0).Caption ,gprinterEncoding)
    garyReceiptHeader(1,1)=ConvertEncoding(lblQryMain(1).Caption,gprinterEncoding)
    garyReceiptHeader(1,2)=ConvertEncoding(lblQryMain(2).Caption,gprinterEncoding)
    
  else
    garyReceiptHeader(1,0)=ConvertEncoding(lblMain(0).Caption,gprinterEncoding)
    garyReceiptHeader(1,1)=ConvertEncoding(lblMain(1).Caption,gprinterEncoding)
    garyReceiptHeader(1,2)=ConvertEncoding(lblMain(2).Caption,gprinterEncoding)
    
  end if
  
  select case gintReceiptWidth
  case 58
    tmpMaxColumnWidth=22
    
  case else
    tmpMaxColumnWidth=40
    
  end select
  
  garyReceiptFooter(1,0)=ConvertEncoding(lblMain(3).Caption,gprinterEncoding)
  garyReceiptFooter(1,1)=ConvertEncoding(lblMain(4).Caption,gprinterEncoding)
  garyReceiptFooter(1,2)=ConvertEncoding(lblMain(5).Caption,gprinterEncoding)
  
  call w.StartPagePrinter
  call w.writeprinter chr(27)+"@"
  call w.writeprinter chr(27)+"!"+ chr(1)
  call w.writeprinter chr(&H1c)+ chr(&h26)
  
  if gblnReceiptLogo=true then
    call w.writeprinter chr(27) +"a" + chr(1)
    call w.WritePrinter chr(&h1b)+"u"+chr(1)
    call w.WritePrinter chr(&H1c) +"p" +chr(1) +chr(0)
  end if
  
  PrintReceiptHeader w
  
  call w.writeprinter chr(27) +"a" + chr(0)
  
  if lstDetails.ListCount >0 then
    for inty=0 to lstDetails.ListCount-1
      call w.WritePrinter chr(27)+"$" +chr(1)+chr(0)
      call w.WritePrinter AdjustTextWidth(lstdetails.cell(inty,cntSDShowDescription),tmpMaxColumnWidth).ConvertEncoding(gPrinterEncoding)
      
      select case gintReceiptWidth
      case 58
        call w.WritePrinter chr(27)+"$"+chr(220)+chr(0)
        call w.WritePrinter AlignRightLineText(lstdetails.cell(inty,cntSDQty),3)
        call w.WritePrinter chr(27)+"$"+chr(40)+chr(256)
        call w.WritePrinter AlignRightLineText(lstdetails.cell(inty,cntSDNetamount),6) + chr(&ha)
        
      case else
        call w.WritePrinter chr(27)+"$"+chr(80)+chr(256)
        call w.WritePrinter AlignRightLineText(lstdetails.cell(inty,cntSDQty),3)        
        call w.WritePrinter chr(27)+"$"+chr(150)+chr(256)
        call w.WritePrinter AlignRightLineText(lstdetails.cell(inty,cntSDNetamount),7) + chr(&ha)
        
      end select
      
    next
    
  end if
  
  PrintReceiptFooter w
    
  call w.EndPagePrinter
  
  '必須放在開Drawer之前, 否則不能切紙
  if gblnReceiptAutoCut=true then
    call w.WritePrinter chr(&h1d)+"V"+ chr(66)+chr(0)
  else
    call w.writeprinter chr(27)+"d"+chr(5)
  end if
  
  
  if gblnEnableDrawer=true then
    if tmpOpenDrawer=true then
      call w.WritePrinter chr(&h1b)+chr(&h70)+chr(&h0) +chr(&H60)+chr(&h120)
    end if
  end if
   
  call w.EndDocPrinter
  w = nil // close printer
  
Sub PrintReceiptHeader(tmpPrintJob as WindowsAddPrintJobMBS)
  dim intY as integer
  
  call tmpPrintJob.writeprinter chr(27)+"@"
  call tmpPrintJob.writeprinter chr(27)+"!"+chr(0)
  call tmpPrintJob.writeprinter chr(27)+"a"+chr(1)
  
  call tmpPrintJob.writeprinter chr(&h1b)+"!"+chr(9)
  call tmpPrintJob.WritePrinter ConvertEncoding(gstrCompanyConfig(0),gPrinterEncoding)+ chr(&ha)
  call tmpPrintJob.writeprinter chr(&h1b)+"!"+chr(0)
  call tmpprintjob.WritePrinter ConvertEncoding(garyReceiptstring(0) + gstrCompanyConfig(3),gPrinterEncoding)+ chr(&ha)
  call tmpprintjob.WritePrinter ConvertEncoding(garyReceiptstring(1) + gstrCompanyConfig(4),gPrinterEncoding)+ chr(&ha)
  
  for inty=0 to 2
    if len( garyReceiptHeading(inty)) >0 then
      call tmpPrintJob.writeprinter ConvertEncoding(garyReceiptHeading(inty),gPrinterEncoding)+ chr(&ha)
    end if
  next
  
  call tmpPrintJob.writeprinter chr(27)+"d"+chr(1)
  
  call tmpPrintJob.writeprinter chr(&h1b)+"!"+chr(17)
  call tmpPrintJob.writeprinter chr(&h1c)+"!"+chr(8)
  call tmpPrintJob.WritePrinter garyReceiptTitle(gintCurrReceiptType) + chr(&ha)
  call tmpPrintJob.writeprinter chr(&h1b)+"!"+chr(0)
  call tmpPrintJob.writeprinter chr(&h1c)+"!"+chr(0)
  
  call tmpPrintJob.writeprinter chr(27)+"d"+chr(1)
  
  call tmpPrintJob.writeprinter chr(27)+"a"+chr(0)
  call tmpPrintJob.WritePrinter garyReceiptHeader(0,0) + garyReceiptHeader(1,0) +chr(&ha)
  call tmpPrintJob.WritePrinter garyReceiptHeader(0,1) + garyReceiptHeader(1,1) +chr(&ha)
  call tmpPrintJob.WritePrinter garyReceiptHeader(0,2) + garyReceiptHeader(1,2) +chr(&ha)
  
  call tmpPrintJob.writeprinter chr(27)+"d"+chr(1)
  
  call tmpPrintJob.writeprinter chr(27)+"a"+chr(0)
  
  call tmpPrintJob.WritePrinter chr(27)+"$" +chr(20)+chr(0)
  call tmpPrintJob.WritePrinter garyReceiptDetailsHeader(0)
  
  select case gintReceiptWidth
  case 58
    call tmpPrintJob.WritePrinter chr(27)+"$" +chr(220)+chr(0)
    call tmpPrintJob.WritePrinter garyReceiptDetailsHeader(1)    
    call tmpPrintJob.WritePrinter chr(27)+"$" +chr(50)+chr(256)
    call tmpPrintJob.WritePrinter garyReceiptDetailsHeader(2) + chr(&ha)    
    call tmpPrintJob.WritePrinter gstrSeparateLine + chr(&ha)
    
  case else
    call tmpPrintJob.WritePrinter chr(27)+"$" +chr(80)+chr(256)
    call tmpPrintJob.WritePrinter garyReceiptDetailsHeader(1)    
    call tmpPrintJob.WritePrinter chr(27)+"$" +chr(160)+chr(256)
    call tmpPrintJob.WritePrinter garyReceiptDetailsHeader(2) + chr(&ha)    
    call tmpPrintJob.WritePrinter gstrSeparateLine + chr(&ha)
    
  end select
  
End Sub
Sub PrintReceiptFooter(tmpPrintJob as WindowsAddPrintJobMBS)
  dim intY as integer
  
  call tmpPrintJob.writeprinter gstrSeparateLine+ chr(&ha)
  call tmpPrintJob.writeprinter chr(&h1b)+"!"+chr(17)
  call tmpPrintJob.writeprinter chr(&h1c)+"!"+chr(8)
  
  call tmpPrintJob.WritePrinter chr(27)+"$" +chr(1)+chr(0)
  call tmpPrintJob.WritePrinter garyReceiptFooter(0,0) 
  
  select case gintReceiptWidth
  case 58
    call tmpPrintJob.WritePrinter chr(27)+"$" +chr(20)+chr(256)
  case else
    call tmpPrintJob.WritePrinter chr(27)+"$" +chr(150)+chr(256)
  end select
  call tmpPrintJob.WritePrinter AlignRightLineText(garyReceiptFooter(1,0),9) +chr(&ha)
  
  call tmpPrintJob.writeprinter chr(&h1b)+"!"+chr(0)
  call tmpPrintJob.writeprinter chr(&h1c)+"!"+chr(0)
  call tmpPrintJob.writeprinter gstrSeparateLine+ chr(&ha)
  
  if gintCurrReceiptType=0 then
    call tmpPrintJob.WritePrinter chr(27)+"$" +chr(1)+chr(0)
    call tmpPrintJob.WritePrinter garyReceiptFooter(0,1)
    
    select case gintReceiptWidth
    case 58
      call tmpPrintJob.WritePrinter chr(27)+"$" +chr(20)+chr(256)
      call tmpPrintJob.WritePrinter AlignRightLineText(garyReceiptFooter(1,1),7) +chr(&ha)
      
    case else
      call tmpPrintJob.WritePrinter chr(27)+"$" +chr(150)+chr(256)
      call tmpPrintJob.WritePrinter AlignRightLineText(garyReceiptFooter(1,1),7) +chr(&ha)
      
    end select
    
    call tmpPrintJob.WritePrinter chr(27)+"$" +chr(1)+chr(0)
    call tmpPrintJob.WritePrinter garyReceiptFooter(0,2)
    
    select case gintReceiptWidth
    case 58
      call tmpPrintJob.WritePrinter chr(27)+"$" +chr(20)+chr(256)
      call tmpPrintJob.WritePrinter AlignRightLineText(garyReceiptFooter(1,2),7) +chr(&ha)+chr(&ha)
      
    case else
      call tmpPrintJob.WritePrinter chr(27)+"$" +chr(150)+chr(256)
      call tmpPrintJob.WritePrinter AlignRightLineText(garyReceiptFooter(1,2),7) +chr(&ha)+chr(&ha)
      
    end select
    
  else
    call tmpPrintJob.writeprinter chr(27)+"d"+chr(4)
    call tmpPrintJob.writeprinter chr(&h1b)+"!"+chr(17)
    call tmpPrintJob.writeprinter chr(&h1c)+"!"+chr(8)
    call tmpprintjob.WritePrinter ConvertEncoding(garyReceiptstring(2) + gstrSignatureLine,gPrinterEncoding)+ chr(&ha)+chr(&ha)
  end if
  
  
  call tmpPrintJob.writeprinter chr(27)+"a"+chr(1)
  call tmpPrintJob.writeprinter chr(&h1b)+"!"+chr(0)
  call tmpPrintJob.writeprinter chr(&h1c)+"!"+chr(0)
  
  for inty=0 to 2
    if len( garyReceiptEnding(inty)) >0 then
      call tmpPrintJob.writeprinter ConvertEncoding(garyReceiptEnding(inty),gPrinterEncoding)+ chr(&ha)
    end if
  next
  
  
End Sub
Function AlignRightLineText(tmpString as string,TextWidth as integer) As string
  dim tmpResult as string
  tmpResult=tmpString
  if (lenb(tmpstring) >0) and (lenb(tmpstring) <textwidth) then
    while lenb(tmpResult) < textwidth
      tmpResult=" "+tmpResult
    wend 
    
  end if 
  
  return tmpResult
End Function