Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Printing to Dot Matrix printer without ejecting paper
Message
From
12/12/2006 21:49:14
Arjun Bagojikop
Dynamic Super Software
Sangli, India
 
General information
Forum:
Visual FoxPro
Category:
Reports & Report designer
Environment versions
Visual FoxPro:
VFP 7 SP1
OS:
Windows XP
Network:
Windows XP
Database:
Visual FoxPro
Miscellaneous
Thread ID:
01176793
Message ID:
01177037
Views:
14
hi
rashid
i had too same problem, i solved this problem permenantly for me
through following command
Lparameters wid
Local WYN,wrec,lprinter
WYN=Messagebox("Print Invoice....",32+4+256,wdevlp)

lprinter=ALLTRIM(single.def_printer) 
* i have stored my default print in single table if you want appear printer dialog box
lprinter=GETPRINTER()

If WYN=6

	If SQLExec(GETCONN,'SELECT * FROM PRINTSALE WHERE id=?wid','PRINTSALE')>0

		wrec=Reccount()/5
		If wrec<=1
			wrec=1
		Endif
		wrec=wrec+4
		Do \dsslib\Program\custompaper With lprinter,'INVOICE',6,wrec
		Report Form invoice to Printer Noconsole Nodialog
	Endif
Endif

***** custompaper.prg
* this following source code i have got from thread 

PARAMETERS _PRINTER,_PAPER,_COL,_ROW
* All sizes in inches
ooo = NEWOBJECT("AddPrinterForm", "AddPrinterFormClass.fxp")
IF NOT ooo.DeleteForm(_PAPER, _PRINTER)
	MESSAGEBOX( ooo.cErrorMessage+CHR(13)+ooo.cApiErrorMessage ,48,'Error Occured')
ENDIF

ooo = NEWOBJECT("AddPrinterForm", "AddPrinterFormClass.fxp")
IF NOT ooo.AddForm(_PAPER, _COL,_ROW,_PRINTER)

	MESSAGEBOX( ooo.cErrorMessage+CHR(13)+ooo.cApiErrorMessage ,48,'Error Occured')

ENDIF
ooo = Null
*RETURN
* All sizes in cm
*ooo = NEWOBJECT("AddPrinterForm", "AddPrinterFormClass.fxp", "", "Metric")
*IF NOT ooo.AddForm("MyCustomForm2", 15,17, "EPSON LQ-1050+")
  * Error
*ENDIF
ooo = Null

*AddPrinterFormClass.prg
* 10/26/2004 -- Added function Sys2600() so code can be run in VFP6 and earlier 
DEFINE CLASS AddPrinterForm AS Custom

	HIDDEN cUnit, cPrinterName, nFormHeight, nFormWidth, nLeftMargin, ;
              nTopMargin, nRightMargin, nBottomMargin, ;
	      nInch2mm, nCm2mm, nCoefficient, hHeap

	cUnit = "English"		&& inches or Metric - cm's
	cPrinterName = ""
	nFormHeight = 0
	nFormWidth = 0
	nLeftMargin = 0
	nTopMargin = 0
	nRightMargin = 0
	nBottomMargin = 0

	nApiErrorCode = 0
	cApiErrorMessage = ""
	cErrorMessage = ""

	nInch2mm = 25.4
	nCm2mm = 10
	nCoefficient = 0

	hHeap = 0

	PROCEDURE Init(tcUnit)
	IF PCOUNT() = 1 AND INLIST(tcUnit, "English", "Metric")
		This.cUnit = PROPER(tcUnit)
	ENDIF
	This.LoadApiDlls()
	This.hHeap = HeapCreate(0, 4096, 0)
	* Use Windows default printer
	This.cPrinterName = SET("Printer",2)
	This.nCoefficient = IIF(PROPER(This.cUnit) = "English", ;
		This.nInch2mm, This.nCm2mm) * 1000
	ENDPROC

	PROCEDURE Destroy
	IF This.hHeap <> 0
		HeapDestroy(This.hHeap)
	ENDIF

	ENDPROC

	PROCEDURE SetFormMargins(tnLeft, tnTop, tnRight, tnBottom)
	WITH This
		.nLeftMargin 	= tnLeft   * .nCoefficient
		.nTopMargin 	= tnTop    * .nCoefficient
		.nRightMargin 	= tnRight  * .nCoefficient
		.nBottomMargin 	= tnBottom * .nCoefficient
	ENDWITH
	ENDPROC

	PROCEDURE AddForm(tcFormName, tnWidth, tnHeight, tcPrinterName)
	LOCAL lhPrinter, llSuccess, lcForm

	This.nFormWidth  = tnWidth  * This.nCoefficient
	This.nFormHeight = tnHeight * This.nCoefficient
	IF PCOUNT() > 3
		This.cPrinterName = tcPrinterName
	ENDIF

	This.ClearErrors()
	lhPrinter = 0
	IF OpenPrinter(This.cPrinterName, @lhPrinter, 0) = 0
		This.cErrorMessage = "Unable to get printer handle for '" ;
                                + This.cPrinterName + "."
		This.nApiErrorCode = GetLastError()
		This.cApiErrorMessage = This.ApiErrorText(This.nApiErrorCode)
		RETURN .F.
	ENDIF

	lnFormName = HeapAlloc(This.hHeap, 0, LEN(tcFormName) + 1)
        * VFP7 and later
	= SYS(2600, lnFormName, LEN(tcFormName) + 1, tcFormName + CHR(0))
        * VFP6 and earlier
	*= Sys2600(lnFormName, LEN(tcFormName) + 1, tcFormName + CHR(0))

	* Build FORM_INFO_1 structure
	WITH This
		lcForm = This.Num2LOng(0) + ;		&& Flags
		This.Num2LOng(lnFormName) + ;
			This.Num2LOng(.nFormWidth) + ;
			This.Num2LOng(.nFormHeight) + ;
			This.Num2LOng(.nLeftMargin) + ;
			This.Num2LOng(.nTopMargin) + ;
			This.Num2LOng(.nFormWidth - .nRightMargin) + ;
			This.Num2LOng(.nFormHeight - .nBottomMargin)
	ENDWITH

	* Finally, call the API
	IF AddForm(lhPrinter, 1, @lcForm) = 0
		This.cErrorMessage = "Unable to Add Form '" + tcFormName + "'."
		This.nApiErrorCode = GetLastError()
		This.cApiErrorMessage = This.ApiErrorText(This.nApiErrorCode)
		llSuccess = .F.
	ELSE
		llSuccess = .T.
	ENDIF
	= HeapFree(This.hHeap, 0, lnFormName)
	= ClosePrinter(lhPrinter)

	RETURN llSuccess

	PROCEDURE ClearErrors
	This.cErrorMessage = ""
	This.nApiErrorCode = 0
	This.cApiErrorMessage = ""
	ENDPROC

	PROCEDURE DeleteForm(tcFormName, tcPrinterName)
	LOCAL lhPrinter, llSuccess

	IF PCOUNT() > 1
		This.cPrinterName = tcPrinterName
	ENDIF

	This.ClearErrors()
	lhPrinter = 0
	IF OpenPrinter(This.cPrinterName, @lhPrinter, 0) = 0
		This.cErrorMessage = "Unable to get printer handle for '" + This.cPrinterName + "."
		This.nApiErrorCode = GetLastError()
		This.cApiErrorMessage = This.ApiErrorText(This.nApiErrorCode)
		RETURN .F.
	ENDIF

	* Finally, call the API
	IF DeleteForm(lhPrinter, tcFormName) = 0
		This.cErrorMessage = "Unable to delete Form '" + tcFormName + "'."
		This.nApiErrorCode = GetLastError()
		This.cApiErrorMessage = This.ApiErrorText(This.nApiErrorCode)
		llSuccess = .F.
	ELSE
		llSuccess = .T.
	ENDIF
	= ClosePrinter(lhPrinter)
	RETURN llSuccess

	FUNCTION Num2LOng(tnNum)
	DECLARE RtlMoveMemory IN WIN32API AS RtlCopyLong ;
		STRING @Dest, Long @Source, Long Length
	LOCAL lcString
	lcString = SPACE(4)
	=RtlCopyLong(@lcString, BITOR(tnNum,0), 4)
	RETURN lcString
	ENDFUNC

	FUNCTION Long2Num(tcLong)
	DECLARE RtlMoveMemory IN WIN32API AS RtlCopyNum ;
		Long @Dest, String @Source, Long Length
	LOCAL lnNum
	lnNum = 0
	= RtlCopyNum(@lnNum, tcLong, 4)
	RETURN lnNum
	ENDFUNC

	HIDDEN PROCEDURE ApiErrorText
		LPARAMETERS tnErrorCode
		Local lcErrBuffer
		lcErrBuffer = REPL(CHR(0),1024)
		= FormatMessage(0x1000 ,.NULL., tnErrorCode, 0, @lcErrBuffer, 1024,0)
		RETURN STRTRAN(LEFT(lcErrBuffer, AT(CHR(0),lcErrBuffer)- 1 ), ;
                         "file", "form", -1, -1, 3)

		ENDPROC

	HIDDEN PROCEDURE LoadApiDlls
		DECLARE INTEGER OpenPrinter IN winspool.drv;
			STRING  pPrinterName,;
			INTEGER @phPrinter,;
			INTEGER pDefault
		DECLARE INTEGER ClosePrinter IN winspool.drv;
			INTEGER hPrinter
		DECLARE INTEGER AddForm IN winspool.drv;
			INTEGER hPrinter,;
			INTEGER LEVEL,;
			STRING  @pForm
		DECLARE INTEGER DeleteForm IN winspool.drv;
			INTEGER hPrinter,;
			STRING  pFormName 
		DECLARE INTEGER HeapCreate IN Win32API;
			INTEGER dwOptions, INTEGER dwInitialSize,;
			INTEGER dwMaxSize
		DECLARE INTEGER HeapAlloc IN Win32API;
			INTEGER hHeap, INTEGER dwFlags, INTEGER dwBytes
		DECLARE lstrcpy IN Win32API;
			STRING @lpstring1, INTEGER lpstring2
		DECLARE INTEGER HeapFree IN Win32API;
			INTEGER hHeap, INTEGER dwFlags, INTEGER lpMem
		DECLARE HeapDestroy IN Win32API;
			INTEGER hHeap
		DECLARE INTEGER GetLastError IN kernel32
		Declare Integer FormatMessage In kernel32.dll ;
			Integer dwFlags, String @lpSource, ;
			Integer dwMessageId, Integer dwLanguageId, ;
			String @lpBuffer, Integer nSize, Integer Arguments

		ENDPROC

ENDDEFINE
*-------------------------------------------------------

FUNCTION Sys2600(tnAddress, tnLength, tcNewString)

IF PCOUNT() = 3
	DECLARE RtlMoveMemory IN WIN32API AS RtlCopy ;
		INTEGER nDestBuffer, STRING pVoidSource, INTEGER nLength
	lcRetVal = LEFT(tcNewString, MIN(tnLength, LEN(tcNewString)))
	=RtlCopy(tnAddress, lcRetVal, LEN(lcRetVal))
ELSE
	DECLARE RtlMoveMemory IN WIN32API AS RtlCopy ;
		STRING @DestBuffer, INTEGER pVoidSource, INTEGER nLength
	lcRetVal = REPL(CHR(0),tnLength)
	=RtlCopy(@lcRetVal, tnAddress, tnLength)
ENDIF		
RETURN lcRetVal
*******************************
Arjun
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform