Post by razorThanks for your suggestions.
I decided to stick with the PC_PRINTER routines. I have a few o/s
problems though that I hope maybe somebody has already had to resolve
in the past.
Problem one is where I print invoices or other reports. At the start
we have some control characters to set the font, orientation, pitch,
etc. Something like this.
01 LANDSCAPE.
03 FILLER PIC 9(2) COMP VALUE 27.
03 FILLER PIC X(16) VALUE
"&l1o8d0l66p0e66F".
Using the PC_PRINT routines I can't do this obviously, especially not
if its going to a non-PCL printer. The PC_PRINT routines don't allow
me to print control characters (rightly so). I think I can resolve
this using the PC_PRINTER_SET_FONT call so thats ok. I may just
generate one print program that interprets these settings from the
existing printed reports and converts the to SET_FONT calls.
Problem two is that I want to print 'boxes' using line drawing
characters. I can't seem to get this working. I have experimented
using the PC_PRINTER_OPEN call by setting the 'flags' to
'11' (Normally set to '1' which just allows selection of a printer)
which brings up a printer font window that allows me to select
different fonts. But none of these allows me to print 'lines'. I
suspect I am barking up the wrong tree doing it this way so any help
will be appreciated.
Problem three is that sometimes in mid line I want to print some
characters in bold. The way I do this at the moment is by inserting
the PCL control characters at the right point in the print line. For
03 FILLER PIC X(15) VALUE "NORMAL TEXT".
03 FILLER PIC 99 COMP VALUE 27.
03 FILLER PIC X(4) VALUE "(s4B".
03 FILLER PIC X(15) VALUE "BOLD TEXT".
03 FILLER PIC 99 COMP VALUE 27.
03 FILLER PIC X(4) VALUE "(s0B".
03 FILLER PIC X(15) VALUE "NORMAL TEXT".
Long winded maybe, but its been around 15 years, running on DOS vers
3, now on XP with a ScreenIO based interface. Looks wonderful.
Any ideas on how I can resolve this one?
Many thanks
As you are obviously using Net Express sign up for their Answer Forum,
where you can get some help to specific queries, plus also check their
KnowledgeBase; their site also includes PC-Printing examples.
Can't help you much myself as my PC was recently 'hospitalised' and now
I have to get a new Request Key for N/E which was corrupted - so I
currently can't even get into NE for Help, to view or test !
Problem 1 - you can't mess around mixing DOS style control characters
with what PC_PRINT routines do. You have to do all your settings with
PC_PRINT.
Problem 2 - Line drawing; not currently having access to NE I'm pretty
sure you can't do this although you can print bitmaps. You will have to
check with Micro Focus to see if there is a routine. (Bear in mind
PC_PRINT is a set of 'popular' needs and not an all singin' all dancin'
bit of software). Lookup up something like text2pdf, (recently listed
here in CLC ) which allows more flexibility. If it is a need to put a
box frame around sections of an invoice, text2pdf or others like it,
will allow you to do this.
Problem 3 - Mid Line changing fonts. No problem (1) send a line with
standard font/spacing and use my 'WriteAndPause' below; (2) Send a line
with your Bold Font and again use the 'WriteAndPause' (3) send print
'WriteAndNewline'
Whichever approach I would strongly support having your print routines
in a separately called program/invoked class. No access to NE, so I
can't update following. But on reflection when sending something like a
printer header block, be it 1, 2, 3.....15 standard lines I would send
the strings of text as an Ordered collection of objects to a
called/invoked header routine, including fonts, size, bold etc., signal
flags per line. The receiving method 'unpacks' each object in the
collection to a printable text string. (That is - using class
CharacterArray - a text string from the caller program/class is
converted to an object and added to an OrderedCollection which is passed
to the printing program. The receiving class then 'unpacks' individual
objects, (using callback/iteration 'do') against the collection using
class CharacterArray to prepare a text string for PC_PRINT.
I'm sure the last paragraph is as clear as mud - but should you wish to
pursue, I don't mind giving it a shot to suit your needs, (other than
that line printing gizmo - if you only need horizontals you can send a
blank line UNDERLINED). But I'll need access to NE before I can help you.
Take the following as is, and It doesn't list quite all of the PC_PRINT
routines.
Jimmy, Calgary AB
*>----------------------- pcprint.cbl ---------------------------
NE V 3.1
Class-id. PCprint
inherits from Base.
Class-control. PCprint is class "pcprint"
CharacterArray is class "chararry"
MessageBox is class "msgbox"
.
*>---------------------------------------------------------------
*> This class includes the following Micro Focus PC_PRINT
*> routines
*> PC_PRINTER_CLOSE Close a printer channel
*> PC_PRINTER_CONTROL Send a printer command to a printer
*>+ PC_PRINTER_DEFAULT_FONT Set the default font
*>+ PC_PRINTER_DEFAULT_NAME Set the default printer
*>+ PC_PRINTER_DEFAULT_PROPERTIES Set one or more properties
*> PC_PRINT_FILE Print a file
*> PC_PRINTER_FREE_BMP Free bitmap from memory
*>+ PC_PRINTER_GET_COLOR Set printer color
*>+ PC_PRINTER_GET_FONT Set printer font
*> PC_PRINTER_INFO Get printer information
*> PC_PRINTER_LOAD_BMP Load bitmap into memory
*> PC_PRINTER_OPEN Open a printer channel
*>+ PC_PRINTER_REDIRECTION_PROC
*> Register a user function to be
*> called when a program uses
*> OPEN OUTPUT syntax.
*> PC_PRINTER_SET_COLOR Set printer color
*>+ PC_PRINTER_SET_DEFAULT Set a process-wide default
*> PC_PRINTER_SET_FONT Set printer font
*> PC_PRINTER_WRITE Write text to a printer
*> PC_PRINTER_WRITE_BMP Write bitmap to a printer
*>--------------------------------------------------------------
*>FACTORY.
*>---------------------------------------------------------------
*>END FACTORY.
*>-------------------------------------------------------------
OBJECT.
*>-------------------------------------------------------------
OBJECT-STORAGE SECTION. *>(COBOL 200X = WORKING-STORAGE SECTION)
01 ws-PrintInfoStructure.
05 PrintStructSize pic x(4) comp-5 value 52.
05 Printhdc pic x(4) comp-5.
05 Printhps pic x(4) comp-5.
05 Printorientation pic x(4) comp-5.
05 Printrows pic x(4) comp-5.
05 Printcols pic x(4) comp-5.
05 PrintRowsLeft pic x(4) comp-5.
05 PrintMaxHoriz pic x(4) comp-5.
05 PrintMaxVert pic x(4) comp-5.
05 PrintMinHoriz pic x(4) comp-5.
05 PrintMinVert pic x(4) comp-5.
05 PrintCurrHoriz pic x(4) comp-5.
05 PrintCurrVert pic x(4) comp-5.
01 ws-PrinterHandle pic x(4) comp-5.
01 ws-PrintWindowHandle pic x(4) comp-5.
01 ws-result pic x(4) comp-5.
01 ws-StatusCode pic x(4) comp-5.
*>-------------------------------------------------------------
01 os-Parent object reference.
*>-------------------------------------------------------------
Method-id. "checkPrinterStatus".
*>-------------------------------------------------------------
Local-Storage section.
01 PrintCommand pic x(4) comp-5.
88 Abort value 1.
88 ThrowPage value 2.
88 FlushBuffers value 3.
88 NewLine value 4.
Procedure Division.
if ws-StatusCode <> zeroes
move 99 to ws-result
invoke self "PrintError"
set Abort to true
call "PC_PRINTER_CONTROL" using ws-PrinterHandle
by value PrintCommand
returning ws-StatusCode
call "PC_PRINTER_CLOSE" using ws-PrinterHandle
returning ws-StatusCode
else move zeroes to ws-result
End-if
End Method "checkPrinterStatus".
*>--------------------------------------------------------
Method-id. "closePrinter".
*>-------------------------------------------------------------
call "PC_PRINTER_CLOSE" using ws-PrinterHandle
returning ws-StatusCode
End Method "closePrinter".
*>--------------------------------------------------------------
Method-id. "getLinecount".
*>-------------------------------------------------------------
Local-Storage section.
01 ls-result pic x(4) comp-5.
Linkage section.
01 lnk-LineCount pic x(4) comp-5.
Procedure Division returning lnk-LineCount.
invoke self "PrinterInfo" returning ls-result
if ls-result = zeroes
move PrintRowsLeft to lnk-LineCount
End-if
End Method "getLinecount".
*>-------------------------------------------------------------
Method-id. "openPrinter".
*>-------------------------------------------------------------
Linkage section.
*> Printflags :-
*> bit 0 Display a printer control dialog to allow you to define
*> the printer characteristics (cannot be used with bit 2
*> or bit 3)
*> bit 1 Display a font dialog box to allow you to define the
*> default font for the document
*> bit 2 Print in portrait orientation (cannot be used with bit
*> 0 or bit 3)
*> bit 3 Print in landscape orientation (cannot be used with bit
*> 0 or bit 2)
*> bit 4 Display a progress indicator dialog box
*> 78 NoDialog value 0.
*> 78 ControlDialog value 1.
*> 78 FontDialog value 10.
*> 78 Portrait value 100.
*> 78 Landscape value 1000.
*> 78 ProgressIndicator value 10000.
01 PrintDocument.
05 PrintTitleLen pic x(2) comp-5.
05 PrintTitle pic x(65).
01 Printflags pic x(4) comp-5.
01 lnk-result pic x(4) comp-5.
Procedure Division using PrintDocument
by value PrintFlags
returning lnk-result.
move zeroes to ws-PrinterHandle, ws-PrintWindowHandle
call "PC_PRINTER_OPEN" using ws-PrinterHandle
PrintDocument
by value PrintFlags
by value ws-PrintWindowHandle
returning ws-StatusCode
invoke self "checkPrinterStatus"
move ws-result to lnk-result
End Method "openPrinter".
*>------------------------------------------------------------
Method-id. "pageThrow".
*>------------------------------------------------------------
*>
*> This is used for laser printers when printing 'back-to-back'
*> or when wanting to throw a blank page between separate parts
*> of a report
*> Note : It is the calling program(class) that checks that the
*> printed report exceeds more than two pages
Local-Storage section.
01 ls-Command pic x(4) comp-5.
88 ThrowPage value 2.
01 pages-remainder pic x(4) comp-5.
Linkage section.
01 lnk-pages pic x(4) comp-5.
01 lnk-ErrorCode pic x(4) comp-5.
Procedure Division using lnk-pages
returning lnk-ErrorCode.
move zeroes to lnk-ErrorCode
compute pages-remainder = function rem (lnk-pages, 2)
if pages-remainder <> zeroes
set ThrowPage to true
invoke self "printCommand"
using by value ls-Command
returning lnk-ErrorCode
End-if
End Method "pageThrow".
*>------------------------------------------------------------
Method-id. "printAfile".
*>-------------------------------------------------------------
*>filename : Group Item :-
*>file-name-length pic x(2) comp-5
*>file-text picx(n) - space/null terminated
*>
*>Document-Title-Length pic x(2) comp-5.
*>Document-Title-Text pic x(n).
*>
*>Flags :-
*>bit 0 Display printer control dialog(Can't use with bits 2 & 3)
*>bit 1 Display a font dialog box
*>bit 2 Print in portrait orientation (can't use with bits 0 & 3)
*>bit 3 Print in landscape orientation(can't use with bits 0 & 2)
*>bit 4 Display a progress indicator dialog box
Linkage section.
01 PCprintName.
05 PCprintnameLength pic x(2) comp-5.
05 PCprintnameText pic x(100).
01 PrintTitle.
05 PrintTitleLength pic x(2) comp-5.
05 PrintTitleText pic x(65).
01 Printflags pic x(4) comp-5.
01 lnk-result pic x(4) comp-5.
Procedure Division using PCprintName
PrintTitle
by value PrintFlags
returning lnk-result.
call "PC_PRINT_FILE" using PCprintname
PrintTitle
by value PrintFlags
by value ws-PrintWindowHandle
returning ws-StatusCode
invoke self "checkPrinterStatus"
move ws-result to lnk-result
End Method "printAfile".
*>--------------------------------------------------------------
Method-id. "printCommand".
*>-------------------------------------------------------------
Linkage section.
01 PrintCommand pic x(4) comp-5.
01 lnk-result pic x(4) comp-5.
Procedure Division using by value PrintCommand
returning lnk-result.
call "PC_PRINTER_CONTROL" using ws-PrinterHandle
by value PrintCommand
returning ws-StatusCode
invoke self "checkPrinterStatus"
move ws-result to lnk-result
End Method "printCommand".
*>--------------------------------------------------------
Method-id. "PrintError".
*>-------------------------------------------------------------
working-storage section.
01 PE1.
05 pic x(40) value "01 Couldn't open printer device ".
05 pic x(40) value "02 Invalid printer control code ".
05 pic x(40) value "03 No device associated with handle ".
05 pic x(40) value "04 Out of memory while printing ".
05 pic x(40) value "05 Failed to open file ".
05 pic x(40) value "06 Disk full while spooling file ".
05 pic x(40) value "07 Aborted. Job not sent to spooler. ".
05 pic x(40) value "08 Printer info badly constructed ".
05 pic x(40) value "09 No default printer found ".
05 pic x(40) value "10 Error when displaying dialog ".
05 pic x(40) value "11 Write failure ".
05 pic x(40) value "12 No fonts found compatible to printer ".
05 pic x(40) value "13 The font requested does not exist ".
05 pic x(40) value "14 User aborted print job ".
05 pic x(40) value "15 Reserved - Unspecified error ".
05 pic x(40) value "16 Reserved - Unspecified error ".
05 pic x(40) value "17 Reserved - Unspecified error ".
05 pic x(40) value "18 Failed to load bitmap ".
05 pic x(40) value "19 Invalid bitmap id ".
05 pic x(40) value "20 Failed to free bitmap ".
05 pic x(40) value "21 Failed to print bitmap ".
05 pic x(40) value "22 Bad parameter ".
05 pic x(40) value "23 User Cancel or Internal error ".
01 PE2 redefines PE1.
05 PE3 occurs 23 pic x(40).
Local-Storage section.
01 ls-length pic x(4) comp-5.
01 ls-MsgBox object reference.
01 ls-string object reference.
01 ls-text pic x(40).
move PE3 (ws-StatusCode) to ls-text
invoke MessageBox "new" using os-Parent returning ls-MsgBox
invoke ls-MsgBox "SetLabelZ" using z"Printer Error" & x"00"
move length of ls-text to ls-length
invoke CharacterArray "withlengthvalue"
using ls-length ls-text returning ls-string
invoke ls-MsgBox "setMessage" using ls-string
invoke ls-MsgBox "setTypeCritical"
invoke ls-MsgBox "Cancel"
invoke ls-MsgBox "show"
invoke ls-MsgBox "finalize" returning ls-MsgBox
End Method "PrintError".
*>----------------------------------------------------------
Method-id. "PrinterInfo".
*>-------------------------------------------------------------
Linkage section.
01 lnk-result pic x(4) comp-5.
Procedure Division returning lnk-result.
call "PC_PRINTER_INFO" using ws-PrinterHandle
ws-PrintInfoStructure
returning ws-StatusCode
invoke self "checkPrinterStatus"
move ws-result to lnk-result
End Method "PrinterInfo".
*>---------------------------------------------------------------
Method-id. "setDefaultFont".
*>--------------------------------------------------------------
*> font-family-name Group item defined as:
*> (a)name-len pic x(2) comp-5.
*> (b)name-text pic x(n).
*>
*> font-size Numeric literal or pic x(4) comp-5.
*> If the point size is zero the font
*> is reset to the system defaults.
*>
*> FontStyle : Numeric literal or pic x(4) comp-5.
*> 78 Regular value 0.
*> 78 Italic value 1. bit 0 Italic
*> 78 Underline value 10. bit 1 Underline
*> 78 Strikeout value 100. bit 2 Strikeout
*> 78 Bold value 1000. bit 3 Bold
Linkage section.
01 FontFamily.
05 FontFamilyLength pic x(2) comp-5.
05 FontFamilyText pic x(40).
01 FontSize pic x(4) comp-5.
01 FontStyle pic x(4) comp-5.
01 lnk-result pic x(4) comp-5.
Procedure Division using FontFamily
by value FontSize
by value FontStyle
returning lnk-result.
call "PC_PRINTER_DEFAULT_FONT" using FontFamily
by value FontSize
by value FontStyle
returning ws-StatusCode
invoke self "checkPrinterStatus"
move ws-result to lnk-result
End Method "setDefaultFont".
*>-------------------------------------------------------------
Method-id. "setFont".
*>-------------------------------------------------------------
Linkage section.
*> FontStyle :-
*> 78 Regular value 0.
*> 78 Italic value 1. bit 0 Italic
*> 78 Underline value 10. bit 1 Underline
*> 78 Strikeout value 100. bit 2 Strikeout
*> 78 Bold value 1000. bit 3 Bold
01 FontFamily.
05 FontNameLen pic x(2) comp-5.
05 FontNameText pic x(20).
01 FontSize pic x(4) comp-5.
01 FontStyle pic x(4) comp-5.
01 lnk-result pic x(4) comp-5.
Procedure Division using FontFamily
by value FontSize
by value FontStyle
returning lnk-result.
call "PC_PRINTER_SET_FONT" using ws-PrinterHandle
FontFamily
by value FontSize
by value FontStyle
returning ws-StatusCode
invoke self "checkPrinterStatus"
move ws-result to lnk-result
End Method "setFont".
*>-------------------------------------------------------------
Method-id. "setParent".
*>-------------------------------------------------------------
Linkage section.
01 lnk-parent object reference.
Procedure Division using lnk-parent.
set os-Parent to lnk-parent
End Method "setParent".
*>--------------------------------------------------------------
Method-id. "writeAndPause".
*>-------------------------------------------------------------
Linkage section.
01 PrintBuffer pic x(185).
01 PrintBufferLen pic x(4) comp-5.
01 lnk-result pic x(4) comp-5.
Procedure Division using PrintBuffer
by value PrintBufferLen
returning lnk-result.
call "PC_PRINTER_WRITE" using ws-PrinterHandle
PrintBuffer
by value PrintBufferLen
returning ws-StatusCode
invoke self "checkPrinterStatus"
move ws-result to lnk-result
End Method "writeAndPause".
*>--------------------------------------------------------------
Method-id. "writeAndNewline".
*>-------------------------------------------------------------
Local-Storage section.
01 ls-return pic x(4) comp-5.
01 PrintCommand pic x(4) comp-5.
88 Abort value 1.
88 ThrowPage value 2.
88 FlushBuffers value 3.
88 NewLine value 4.
Linkage section.
01 PrintBuffer pic x(185).
01 PrintBufferLen pic x(4) comp-5.
01 lnk-result pic x(4) comp-5.
Procedure Division using PrintBuffer
by value PrintBufferLen
returning lnk-result.
call "PC_PRINTER_WRITE" using ws-PrinterHandle
PrintBuffer
by value PrintBufferLen
returning ws-StatusCode
invoke self "checkPrinterStatus"
if ws-result = zeroes
set Newline to true
invoke self "printCommand"
using by value PrintCommand returning ls-return
move ls-return to lnk-result
else move ws-result to lnk-result
End-if
End Method "writeAndNewline".
*>--------------------------------------------------------------
Method-id. "writeBlankLine".
*>-------------------------------------------------------------
Local-Storage section.
01 x pic x(4) comp-5.
01 PrintBuffer pic x(185).
01 PrintBufferLen pic x(4) comp-5.
Linkage section.
01 n pic x(4) comp-5.
01 lnk-result pic x(4) comp-5.
Procedure Division using n
returning lnk-result.
move spaces to PrintBuffer
move 1 to PrintBufferLen
perform varying x from 1 by 1 until x > n
or lnk-result <> zeroes
invoke self "writeAndNewline"
using PrintBuffer
by value PrintBufferLen
returning lnk-result
End-perform
End Method "writeBlankLine".
*>---------------------------------------------------------------
END OBJECT.
END CLASS PCprint.
*---------------------------------------------------------------------------