* AddPrinterForm.prg
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
cApiErrorMessage = ""
cErrorMessage = ""
nInch2mm = 25.4
nCm2mm = 10
nCoefficient = This.nInch2mm * 1000
hHeap = 0
* Win API support class
oWas = NULL
PROCEDURE Init(tcUnit)
This.oWas = NEWOBJECT("WinApiSupport", "WinApiSupport.fxp")
IF PCOUNT() = 1
This.cUnit = PROPER(tcUnit)
ENDIF
This.LoadApiDlls()
This.hHeap = HeapCreate(0, 4096, 0)
* Use Windows default printer
This.cPrinterName = SET("Printer",2)
ENDPROC
PROCEDURE cUnit_Assign(tcUnit)
IF INLIST(tcUnit, "English", "Metric")
This.cUnit = PROPER(tcUnit)
ELSE
RETURN
ENDIF
* Calculate conversion coefficient
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, llOK, 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.cApiErrorMessage = WinApiErrMsg(GetLastError())
RETURN .F.
ENDIF
lnFormName = HeapAlloc(This.hHeap, 0, LEN(tcFormName) + 1)
= SYS(2600, lnFormName, LEN(tcFormName) + 1, tcFormName + CHR(0))
* Build FORM_INFO_1 structure
WITH This.oWas
lcForm = .Num2Long(0) + .Num2Long(lnFormName) + ;
.Num2Long(This.nFormWidth) + .Num2Long(This.nFormHeight) + ;
.Num2Long(This.nLeftMargin) + .Num2Long(This.nTopMargin) + ;
.Num2Long(This.nFormWidth - This.nRightMargin) + ;
.Num2Long(This.nFormHeight - This.nBottomMargin)
ENDWITH
* Finally, call the API
IF AddForm(lhPrinter, 1, @lcForm) = 0
This.cErrorMessage = "Unable to Add Form " + tcFormName
This.cApiErrorMessage = STRTRAN(WinApiErrMsg(GetLastError()), "file", "form", -1, -1, 3)
llOK = .F.
ELSE
llOK = .T.
ENDIF
= HeapFree(This.hHeap, 0, lnFormName)
= ClosePrinter(lhPrinter)
RETURN llOK
PROCEDURE ClearErrors
This.cErrorMessage = ""
This.cApiErrorMessage = ""
ENDPROC
PROCEDURE DeleteForm(tcFormName, tcPrinterName)
LOCAL lhPrinter, llOK
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.cApiErrorMessage = WinApiErrMsg(GetLastError())
RETURN .F.
ENDIF
* Finally, call the API
llOK = ( DeleteForm(lhPrinter, tcFormName) <> 0 )
IF NOT llOK
This.cErrorMessage = "Unable to delete Form " + tcFormName
This.cApiErrorMessage = STRTRAN(WinApiErrMsg(GetLastError()), "file", "form", -1, -1, 3)
ENDIF
= ClosePrinter(lhPrinter)
RETURN llOK
HIDDEN PROCEDURE LoadApiDlls
DECLARE Long HeapCreate IN WIN32API Long dwOptions, Long dwInitialSize, Long dwMaxSize
DECLARE Long HeapAlloc IN WIN32API Long hHeap, Long dwFlags, Long dwBytes
DECLARE Long HeapFree IN WIN32API Long hHeap, Long dwFlags, Long lpMem
DECLARE HeapDestroy IN WIN32API Long hHeap
DECLARE Long GetLastError IN kernel32
ENDPROC
ENDDEFINE
*----------------------------------------------------------------------------------------------
FUNCTION OpenPrinter(tcPrinterName, thPrinter, tcDefault)
DECLARE Long OpenPrinter IN WinSpool.Drv ;
String pPrinterName, Long @ phPrinter, String pDefault
RETURN OpenPrinter(tcPrinterName, @thPrinter, tcDefault)
FUNCTION ClosePrinter (thPrinter)
DECLARE Long ClosePrinter IN WinSpool.Drv Long hPrinter
RETURN ClosePrinter(thPrinter)
FUNCTION AddForm(thPrinter, tnLevel, tcForm)
DECLARE Long AddForm IN winspool.drv Long hPrinter, Long Level, String @pForm
RETURN AddForm(thPrinter, tnLevel, tcForm)
FUNCTION DeleteForm(thPrinter, tcForm)
DECLARE Long DeleteForm IN winspool.drv Long hPrinter, String pFormName
RETURN DeleteForm(thPrinter, tcForm)
* Ref : http://www.berezniker.com
No comments:
Post a Comment