home *** CD-ROM | disk | FTP | other *** search
/ Boston 2 / boston-2.iso / DOS / ANWENDUN / DINOS / PDRIVERS / GEN_PD.PRG < prev    next >
Text File  |  1993-12-01  |  24KB  |  967 lines

  1. *:*********************************************************************
  2. *:
  3. *: Procedure file: C:\PRO20\PDRIVERS\GEN_PD.PRG
  4. *:
  5. *:         System: FoxPro Printer Driver Application
  6. *:         Author: MCP
  7. *:      Copyright (c) 1991, Microsoft Corp.
  8. *:  Last modified: 07/09/91      9:25
  9. *:
  10. *:  Procs & Fncts: USERESO
  11. *:               : SETPDRIVER
  12. *:               : CLEANUP
  13. *:               : LOCATEPD()
  14. *:               : ALRT
  15. *:               : RESTORE_DATA
  16. *:
  17. *:          Calls: USERESO            (procedure in GEN_PD.PRG)
  18. *:               : SETPDRIVER         (procedure in GEN_PD.PRG)
  19. *:               : CLEANUP            (procedure in GEN_PD.PRG)
  20. *:               : LOCATEPD()         (function  in GEN_PD.PRG)
  21. *:               : PD_SETUP.SPR
  22. *:               : ALRT               (procedure in GEN_PD.PRG)
  23. *:               : PD_EDIT.SPR
  24. *:
  25. *:   Memory Files: MEMO.MEM
  26. *:
  27. *:      Documented 07/09/91 at 09:27               FoxDoc  version 2.10
  28. *:           Updated 03/05/92    MCP        Support for Scalable Fonts (HPLJIII)
  29. *:*********************************************************************
  30. *
  31. * _pdparms Element Layout
  32. *
  33.  
  34. *  Element        Non-Postcript Printer                         Postscript
  35.  
  36. *    1            Printer Name                                Portrait Orientation (.T.)
  37. *    2            Port                                        Number of Copies
  38. *    3            Setup / First Page Flag                        Scaled Font Size
  39. *    4            Reset                                        Spacing Factor (leading)
  40. *    5            Form Length                                    Italic (.T.)
  41. *    6            Form Feed                                    Bold (.T.)
  42. *    7            Lines per Inch                                Top Margin
  43. *    8            Characters per Inch / Font Size                Document Width / Width Scaling Factor
  44. *    9            Compressed                                     Document Length / Length Scaling Factor
  45. *    10            Orientation (Portrait/Landscape)            Bottom Margin
  46. *    11            Bold On                                        Left Margin
  47. *    12            Bold off                                    Font Name
  48. *    13            Underline On                                Bold Font
  49. *    14            Underline Off                                Italic Font
  50. *    15            Italic On                                    Font Separator
  51. *    16            Italic Off                                    Regular Font
  52. *    17            Superscript On                                Document height
  53. *    18            Superscript Off                                Full Normal Font Name
  54. *    19            Subscript On                                Scaled Superscript Size
  55. *    20            Subscript Off                                Scaled Subscript Size
  56. *    21            Object Printed on Current Page?                Actual Font Size
  57. *    22            New Line                                    Superscript Size
  58. *    23            Horizontal Move Command-1                    Subscript Size
  59. *    24            Horizontal Move Command-2                    PDdocst User Procedure
  60. *    25            Global Style (Normal/Italic)                PDpagest User Procedure
  61. *    26            Global Stroke (Medium/Bold)                    PDlinest User Procedure
  62. *    27            Line Number                                    PDobjectst User Procedure
  63. *    28            Document Height                                PDobject User Procedure
  64. *    29            Document Width                                PDobjectend User Procedure
  65. *    30            PDdocst User Procedure                        PDlineend User Procedure
  66. *    31            PDpagest User Procedure                        PDpageend User Procedure
  67. *    32            PDlinest User Procedure                        PDdocend User Procedure
  68. *    33            PDobjectst User Procedure                    Object Counter
  69. *    34            PDobject User Procedure                        Numeric Scaled Font Size
  70. *    35            PDobjectend User Procedure                    Not Used
  71. *    36            PDlineend User Procedure                    Horizontal Points on Page
  72. *    37            PDpageend User Procedure                    Vertical Points on Page
  73. *    38            PDdocend User Procedure                        Include Regular Font Name with Italic
  74. *   39          Internal Flag                               Loaded as PDriver/Library Flag
  75. *   40          Top Margin Command                          API Load _PDPARMS proc. address
  76. *    41            Top Margin in lines
  77. *    42            Capture Buffer
  78. *    43            Loaded as PDriver/Library Flag
  79. *    44            Font Size
  80. *    45            Font Command
  81. *    46            Current Column Number
  82. *    47            Horizontal Dots per Page
  83. *    48            Number of Dots per Column
  84. *    49            Point size (Design) in inches
  85. *    50            Graphic Character width 
  86. *   51          Numeric Character width
  87. *   52          API Load _PDPARMS proc. address (Must be Last element).
  88. *
  89.  
  90.  
  91.  
  92. PARAMETERS m.callagain, m.setupname
  93.  
  94. PRIVATE m.g_foxuser, m.talk, m.fox, m.deleted, m.workarea, ;
  95.         m.g_pddriver, m.g_pdorientation, m.g_pdstyle, m.g_pdstroke, m.g_pdleading, ;
  96.         m.g_pdcpi, m.g_pdlpi, m.g_pdfontsize, m.g_pdfont, m.g_pdtmargin, ;
  97.         m.g_pdlmargin, m.g_pdname, m.g_saved, m.found, m.g_action, m.g_pdpgsize, ;
  98.         m.chg_flag, m.g_pdprocs, m.save_setup, m.trbetween, m.escape, m.none, m.exact, ;
  99.         m.readonly, m.memofield, m.tempfile, m.g_setfields
  100.  
  101.  
  102. IF SET("TALK") = "ON"
  103.     SET TALK OFF
  104.     m.talk = .T.
  105. ELSE
  106.     m.talk = .F.
  107. ENDIF
  108.  
  109.  
  110. IF SET("ESCAPE") = "ON"
  111.     m.escape = .T.
  112.     SET ESCAPE OFF
  113. ELSE
  114.     m.escape = .F.
  115. ENDIF
  116.  
  117.  
  118. IF SET("DELETED") = "ON"
  119.     m.deleted = .T.
  120. ELSE
  121.     m.deleted = .F.
  122.     SET DELETED ON
  123. ENDIF
  124.  
  125. IF SET("FIELDS",1) != "ALL"
  126.     m.g_setfields = SET("FIELDS",1)
  127. ELSE
  128.     m.g_setfields = ""
  129. ENDIF
  130.  
  131. m.trbetween = SET("TRBET")
  132. SET TRBET OFF
  133.  
  134. IF SET("EXACT") = "ON"
  135.     m.exact = .T.
  136. ELSE
  137.     m.exact = .F.
  138.     SET EXACT ON
  139. ENDIF
  140.  
  141.  
  142. PUSH KEY
  143. STORE "" TO m.g_foxuser, m.fox
  144. STORE .F. TO m.readonly
  145. m.workarea = SELECT()
  146. m.merk_p = SET("POINT")
  147. SET POINT TO '.'
  148. *
  149. * Check the number of parameters were passed.  If there were none, then
  150. * set the printer driver up with the default printer driver if there is one.
  151. *
  152.  
  153. IF PARAMETERS() = 0
  154.  
  155.     DO usereso
  156.     IF NOT EMPTY(m.g_foxuser)
  157.  
  158.         LOCATE FOR type = "DATA2.0" AND id = "PDSETUP" ;
  159.             AND LEFT(name, 1) = "-"
  160.  
  161.         IF FOUND()
  162.  
  163.             IF (ckval = VAL(SYS(2007, SUBSTR(data,3))) AND SUBSTR(data,1,2) = CHR(2) + CHR(0)) OR ;
  164.                 (ckval = VAL(SYS(2007, data)) AND SUBSTR(data,1,2) = CHR(0) + CHR(2))
  165.  
  166.                 IF m.readonly
  167.                     m.tempfile = SYS(2023) + SYS(3)
  168.                     m.memofield = SUBSTR(data,3)        && Get rid of version number.
  169.                     COPY STRUCTURE TO (m.tempfile) FIELDS data
  170.                     SELECT 0
  171.                     USE (m.tempfile)
  172.                     APPEND BLANK
  173.                     REPLACE data WITH m.memofield
  174.                     RESTORE FROM MEMO data ADDITIVE
  175.                     USE
  176.                     SELECT (m.g_foxuser)
  177.                     DELETE FILE (m.tempfile + ".DBF")
  178.                     DELETE FILE (m.tempfile + ".FPT")
  179.                 ELSE
  180.                     REPLACE data WITH SUBSTR(data,3)        && Get rid of version number.
  181.                     RESTORE FROM MEMO data ADDITIVE
  182.                     REPLACE ckval WITH VAL(SYS(2007, DATA))        && Insure the correct ckval
  183.                     REPLACE data WITH CHR(2) + CHR(0) + data
  184.                 ENDIF
  185.  
  186.                 DO setpdriver
  187.  
  188.             ENDIF
  189.  
  190.         ENDIF
  191.  
  192.     ENDIF
  193.  
  194.     DO cleanup
  195.     RETURN
  196.  
  197. ENDIF
  198.  
  199.  
  200. STORE .F. TO m.found
  201.  
  202.  
  203. *
  204. * Initialization of the screen variables
  205. *
  206. DIMENSION g_pdfiles[9], g_pdchkbox[9]
  207.  
  208. m.g_action = 5
  209. g_pdfiles = ""
  210. g_pdchkbox = 0
  211. m.g_pddriver = ""
  212. m.g_pdorientation = 1
  213. m.g_pdstyle = 1
  214. m.g_pdstroke = 1
  215. m.g_pdcpi = 1
  216. m.g_pdlpi = 1
  217. m.g_pdfontsize = "10.0"
  218. m.g_pdfont = "Times"
  219. m.g_pdtmargin = 2                && In Lines
  220. m.g_pdlmargin = 15                && In Points
  221. m.g_pdleading = 12.00
  222. m.g_pdname = IIF((m.setupname = "?") OR (m.callagain = 2), "", m.setupname)
  223. m.chg_flag = .F.
  224. m.g_pdpgsize = 1
  225. m.g_pdprocs = 0
  226. m.none = .F.
  227.  
  228. DO usereso
  229.  
  230. IF (NOT EMPTY(m.g_foxuser) AND NOT locatepd()) OR m.callagain = 2
  231.  
  232.     IF NOT EMPTY(_PDSETUP) AND (EMPTY(m.setupname) OR m.setupname = "?")
  233.         m.setupname = _PDSETUP
  234.         m.none = .T.
  235.     ELSE
  236.         IF m.callagain != 2 OR EMPTY(m.setupname)
  237.             m.setupname = "<Keiner>"
  238.         ENDIF
  239.     ENDIF
  240.  
  241.     IF NOT EMPTY(m.g_foxuser)
  242.         m.save_setup = m.setupname
  243.  
  244.         IF RDLEVEL() >= 4
  245.             IF  ATC("(X)",VERSION()) = 0
  246.                 DO alrt WITH "Stack zu klein für Druckertreibersetup."
  247.             ELSE
  248.                 DO alrt WITH "Aktueller Read-Level zu hoch."
  249.             ENDIF
  250.             m.setupname = "<Keiner>"
  251.         ELSE
  252.             DO pd_setup.spr
  253.         ENDIF
  254.  
  255.         IF (m.g_action = 5) OR (ALLTRIM(m.setupname) = "<Keiner>") OR ;
  256.                 (NOT m.found)
  257.             IF ALLTRIM(m.save_setup) = "<Keiner>" OR ;
  258.                 (ALLTRIM(m.setupname) = "<Keiner>" AND m.g_action != 5) OR m.none
  259.                 m.save_setup = ""
  260.             ENDIF
  261.             DO cleanup
  262.             RETURN m.save_setup
  263.         ENDIF
  264.     ELSE
  265.         IF m.callagain = 2
  266.             DO alrt WITH "Resource-Datei nicht verfügbar."
  267.             m.g_saved = 1
  268.         ELSE
  269.  
  270.             m.g_saved = 1
  271.  
  272.             IF RDLEVEL() >= 4
  273.                 IF  ATC("(X)",VERSION()) = 0
  274.                     DO alrt WITH "Stack zu klein für Druckertreibersetup."
  275.                 ELSE
  276.                     DO alrt WITH "Aktueller Read-Level zu hoch."
  277.                 ENDIF
  278.             ELSE
  279.                 DO pd_edit.spr
  280.             ENDIF
  281.  
  282.         ENDIF
  283.         IF m.g_saved = 1
  284.             DO cleanup
  285.             RETURN
  286.         ENDIF
  287.     ENDIF
  288.  
  289. ELSE
  290.  
  291.  
  292.     *
  293.     * If there isn't a foxuser file active, then bring up the dialog
  294.     * to Create a Setup.
  295.     *
  296.  
  297.     m.g_saved = 2
  298.     IF EMPTY(m.g_foxuser)
  299.  
  300.         m.chg_flag = .T.
  301.  
  302.         IF RDLEVEL() >= 4
  303.             IF  ATC("(X)",VERSION()) = 0
  304.                 DO alrt WITH "Stack zu klein für Druckertreibersetup."
  305.             ELSE
  306.                 DO alrt WITH "Aktueller Read-Level zu hoch."
  307.             ENDIF
  308.             m.g_saved = 1
  309.         ELSE
  310.             DO pd_edit.spr
  311.         ENDIF
  312.  
  313.     ENDIF
  314.  
  315.     IF     m.g_saved = 1 AND NOT m.found
  316.         DO cleanup
  317.         RETURN
  318.     ENDIF
  319.  
  320. ENDIF
  321.  
  322. IF m.callagain != 2
  323.     DO setpdriver
  324. ENDIF
  325. DO cleanup
  326.  
  327. RETURN m.g_pdname
  328.  
  329.  
  330.  
  331.  
  332.  
  333. *!*********************************************************************
  334. *!
  335. *!       Function: LOCATEPD()
  336. *!
  337. *!      Called by: GEN_PD.PRG
  338. *!               : SETPD()            (function  in PD_SETUP.SPR)
  339. *!               : M.g_action valid() (function  in PD_SETUP.SPR)
  340. *!
  341. *!          Calls: RESTORE_DATA       (procedure in GEN_PD.PRG)
  342. *!               : ALRT               (procedure in GEN_PD.PRG)
  343. *!
  344. *!   Memory Files: MEMO.MEM
  345. *!
  346. *!*********************************************************************
  347. PROCEDURE locatepd
  348.  
  349.     m.found = .F.
  350.     SELECT (m.g_foxuser)
  351.     LOCATE FOR type = "DATA2.0" AND id = "PDSETUP"
  352.     IF FOUND()
  353.  
  354.         m.found = .T.
  355.         DO WHILE m.found
  356. *
  357. * Restore if it is found, Locate another otherwise.
  358. *
  359.             IF ALLTRIM(UPPER(name)) == ALLTRIM(UPPER(m.setupname)) OR ;
  360.                 ALLTRIM(UPPER(SUBSTR(name,2))) == ALLTRIM(UPPER(m.setupname))
  361.  
  362.                 IF (ckval = VAL(SYS(2007, SUBSTR(data,3))) AND SUBSTR(data,1,2) = CHR(2) + CHR(0)) OR ;
  363.                     (ckval = VAL(SYS(2007, data)) AND SUBSTR(data,1,2) = CHR(0) + CHR(2))
  364.  
  365.                     IF m.readonly
  366.                         DO restore_data
  367.                     ELSE
  368.                         REPLACE data WITH SUBSTR(data,3)        && Get rid of version number.
  369.                         RESTORE FROM MEMO data ADDITIVE
  370.                         REPLACE ckval WITH VAL(SYS(2007, DATA))        && Insure the correct ckval
  371.                         REPLACE data WITH CHR(2) + CHR(0) + data
  372.                     ENDIF
  373.  
  374.                     EXIT
  375.                 ELSE
  376.                     DO alrt WITH "Setup zerstört oder ungültig."
  377.                     m.found = .F.
  378.                 ENDIF
  379.  
  380.             ELSE
  381.                 CONTINUE
  382.                 IF NOT FOUND()
  383.                     m.found = .F.
  384.                 ENDIF
  385.             ENDIF
  386.         ENDDO
  387.  
  388.     ENDIF
  389.  
  390. RETURN m.found
  391.  
  392.  
  393. *!*********************************************************************
  394. *!
  395. *!      Procedure: USERESO
  396. *!
  397. *!      Called by: GEN_PD.PRG
  398. *!
  399. *!*********************************************************************
  400. PROCEDURE usereso
  401. PRIVATE attribs
  402.  
  403.     IF SET("RESOURCE") = "ON"        && Check to see if the resource is active.
  404.  
  405.         m.fox = SYS(2005)
  406.         m.g_foxuser = SYS(2015)
  407.         SELECT 0
  408.         IF (ADIR(attribs, m.fox) = 0) OR (LEFT(attribs[1,5],1) = "R")
  409.             m.readonly = .T.
  410.         ENDIF
  411.         USE (m.fox) AGAIN ALIAS (m.g_foxuser)
  412.  
  413.  
  414.     ENDIF
  415.  
  416. RETURN
  417.  
  418.  
  419. *!*********************************************************************
  420. *!
  421. *!      Procedure: RESTORE_DATA
  422. *!
  423. *!      Called by: LOCATEPD()         (function  in GEN_PD.PRG)
  424. *!
  425. *!   Memory Files: MEMO.MEM
  426. *!
  427. *!*********************************************************************
  428. PROCEDURE restore_data
  429. PRIVATE m.tempfile, m.memofield
  430.  
  431.     m.tempfile = SYS(2023) + SYS(3)
  432.     m.memofield = SUBSTR(data,3)        && Get rid of version number.
  433.     COPY STRUCTURE TO (m.tempfile) FIELDS data
  434.     SELECT 0
  435.     USE (m.tempfile)
  436.     APPEND BLANK
  437.     REPLACE data WITH m.memofield
  438.     RESTORE FROM MEMO data ADDITIVE
  439.     USE
  440.     SELECT (m.g_foxuser)
  441.     DELETE FILE (m.tempfile + ".DBF")
  442.     DELETE FILE (m.tempfile + ".FPT")
  443.  
  444. RETURN
  445.  
  446.  
  447.  
  448. *!*********************************************************************
  449. *!
  450. *!      Procedure: SETPDRIVER
  451. *!
  452. *!      Called by: GEN_PD.PRG
  453. *!
  454. *!          Calls: ALRT               (procedure in GEN_PD.PRG)
  455. *!
  456. *!           Uses: FONTS.DBF
  457. *!               : P_CODES.DBF
  458. *!
  459. *!      CDX files: FONTS.CDX
  460. *!               : P_CODES.CDX
  461. *!
  462. *!*********************************************************************
  463. PROCEDURE setpdriver
  464. PRIVATE m.first, m.char, m.horizpts, m.vertpts, m.i, m.second, m.select, ;
  465.         m.string
  466.  
  467.     *
  468.     * At this point, the variables which will populate _pdparms should
  469.     * be setup.
  470.     *
  471.  
  472.     _PDRIVER = ""            && Release any active printer driver.
  473.  
  474.     IF m.g_pddriver = "Postscript"
  475.  
  476.  
  477.         PUBLIC _pdparms[40]
  478.  
  479.  
  480.         _pdparms[2] = "1"
  481.         _pdparms[3] = "1"                && Scaled Font Size
  482.         _pdparms[4] = m.g_pdleading        && Spacing Factor (leading)
  483.         _pdparms[5] = m.g_pdstyle
  484.         _pdparms[6] = m.g_pdstroke
  485.         _pdparms[7] = m.g_pdtmargin
  486.         _pdparms[8] = "80"            && Document Width
  487.         _pdparms[9] = 66            && Document Length
  488.         _pdparms[10] = 2            && Bottom Margin
  489.         _pdparms[11] = m.g_pdlmargin
  490.         _pdparms[21] = m.g_pdfontsize
  491.         _pdparms[33] = 0            && Object length counter
  492.         _pdparms[34] = 1            && Numeric Scaled Font Size
  493.  
  494. *
  495. * Check what size paper and assign appropriate values.
  496. *
  497.  
  498.         DO CASE
  499.         CASE m.g_pdpgsize = 1
  500.             m.horizpts = 612
  501.             m.vertpts = 792
  502.  
  503.         CASE m.g_pdpgsize = 2
  504.             m.horizpts = 612
  505.             m.vertpts = 1008
  506.  
  507.         CASE m.g_pdpgsize = 3
  508.             m.horizpts = 595
  509.             m.vertpts = 839
  510.  
  511.         ENDCASE
  512.  
  513. *
  514. * Set up for Landscape or Portrait Orientation.
  515. *
  516.         IF m.g_pdorientation = 1
  517.             _pdparms[1] = .T.
  518.             _pdparms[36] = m.horizpts
  519.             _pdparms[37] = m.vertpts
  520.         ELSE
  521.             _pdparms[1] = .F.
  522.             _pdparms[36] = m.vertpts
  523.             _pdparms[37] = m.horizpts
  524.         ENDIF
  525.  
  526.  
  527.  
  528.         SELECT 0
  529.         USE fonts AGAIN
  530.         LOCATE FOR ALLTRIM(m.g_pdfont) == ALLTRIM(fonts.fontname)
  531.  
  532.         IF FOUND()
  533.             _pdparms[12] = "/" + ALLTRIM(fonts.fontname)
  534.             _pdparms[13] = ALLTRIM(fonts.bold)
  535.             _pdparms[14] = ALLTRIM(fonts.italic)
  536.             _pdparms[15] = ALLTRIM(fonts.separator)
  537.             _pdparms[16] = ALLTRIM(fonts.regular)
  538.             _pdparms[38] = fonts.incl_reg
  539.             _pdparms[18] = _pdparms[12]
  540.  
  541.             IF EMPTY(_pdparms[13]) AND EMPTY(_pdparms[14]) OR ;
  542.                 (_pdparms[5] = 1 AND _pdparms[6] = 1)
  543.                 IF NOT EMPTY(_pdparms[16])
  544.                     _pdparms[18] = _pdparms[18]  + _pdparms[15] + _pdparms[16]
  545.                 ENDIF
  546.             ELSE
  547.  
  548.                 IF (_pdparms[6] = 2)                && Bold
  549.  
  550.                     _pdparms[18] = _pdparms[18]  + _pdparms[15] + _pdparms[13]
  551.                     IF _pdparms[5] = 2                && Bold and Italic
  552.                         _pdparms[18] = _pdparms[18]  + _pdparms[15] + _pdparms[13]
  553.                     ENDIF
  554.  
  555.                 ELSE
  556.                     IF _pdparms[5] = 2
  557.                         IF _pdparms[38]                && Italic include Normal
  558.                             _pdparms[18] = _pdparms[18]  + _pdparms[15] + _pdparms[16] + _pdparms[14]
  559.                         ELSE                        && Italic do not include Normal
  560.                             _pdparms[18] = _pdparms[18]  + _pdparms[15] + _pdparms[14]
  561.                         ENDIF
  562.                     ENDIF
  563.                 ENDIF
  564.  
  565.             ENDIF
  566.         ELSE
  567.             _pdparms[12] = "/Times"
  568.             _pdparms[13] = "Fett"
  569.             _pdparms[14] = "Kursiv"
  570.             _pdparms[15] = "-"
  571.             _pdparms[16] = "Roman"
  572.             _pdparms[38] = .F.
  573.         ENDIF
  574.  
  575.         USE
  576.  
  577.  
  578.         _pdparms[17] = _pdparms[36] / 80
  579.         _pdparms[22] = VAL(_pdparms[21]) * .5
  580.         _pdparms[23] = _pdparms[22] * .5
  581.         _pdparms[19] = ALLTRIM(STR(_pdparms[22]))
  582.         _pdparms[20] = ALLTRIM(STR(_pdparms[23]))
  583.  
  584.         =ACOPY(g_pdfiles, _pdparms, 1, 9, 24)
  585.  
  586.         _pdparms[39] = IIF(TYPE('_pdparms[39]') = 'N', _pdparms[39] + 1, 0)
  587. *
  588. * If you would like to use the XBase version of the printer drivers,
  589. * uncomment the line below
  590. *
  591. *         _PDRIVER = "PS.PRG"
  592.  
  593.  
  594. * and make the line below a comment.
  595.         _PDRIVER = "PSAPI.PLB"
  596.  
  597.  
  598.     ELSE        && The printer driver is for a character based printer.
  599.  
  600.  
  601.         PUBLIC _pdparms[52]
  602.         _pdparms[42] = ""
  603.  
  604.         SELECT 0
  605.         m.select = SELECT()
  606.         USE p_codes AGAIN
  607.         LOCATE FOR p_name == m.g_pddriver
  608.         IF FOUND()
  609.  
  610.             SCATTER FIELDS p_name, p_outport, p_setup, p_reset, ;
  611.                     p_flen, p_ff, (IIF(m.g_pdlpi = 1, "p_6lpi", "p_8lpi")), ;
  612.                     p_10cpi, p_compress, ;
  613.                     (IIF(m.g_pdorientation = 1,"p_portrait", "p_landscap")), ;
  614.                     p_boldon, p_boldoff, p_ulineon, p_ulineoff, p_italon, ;
  615.                     p_italoff, p_superon, p_superoff, p_subon, p_suboff, ;
  616.                     p_fixed, p_crlf, p_horzmv1, p_horzmv2 ;
  617.                     TO _pdparms
  618.  
  619.  
  620.  
  621.             DO CASE
  622.                 CASE g_pdcpi = 1
  623.                     _pdparms[8] = p_10cpi
  624.                 CASE g_pdcpi = 2
  625.                     _pdparms[8] = p_12cpi
  626.                 CASE g_pdcpi = 3
  627.                     _pdparms[8] = p_compress
  628.             ENDCASE
  629.  
  630.             IF p_codes.p_fonts
  631.                 
  632.                 _pdparms[44] = VAL(m.g_pdfontsize)
  633.                 
  634.                 SELECT 0
  635.                 USE fonts AGAIN
  636.                 LOCATE FOR m.g_pdfont == fonts.fontname AND ;
  637.                         m.g_pddriver == fonts.printer
  638.                 
  639.                 IF FOUND()
  640.                     
  641.                     IF fonts.scalable
  642.                         
  643.                         DO embedednum WITH p_codes.p_fontsize, 8, m.g_pdfontsize
  644.                         
  645.                         m.val_font = VAL(m.g_pdfontsize)
  646.                         m.supersize = ALLTRIM(STR(m.val_font/2, 6,2))
  647.                         m.movement = ALLTRIM(STR(m.val_font * 3.5,6,2))
  648.                         
  649.                         DO embedednum with fonts.superon, 17, m.supersize
  650.                         DO embedednum with _pdparms[17], 17, m.movement
  651.                         DO embedednum with fonts.superoff, 18, m.g_pdfontsize
  652.                         DO embedednum with _pdparms[18], 18, m.movement
  653.                         
  654.                         m.movement = ALLTRIM(STR(m.val_font * 3,6,2))
  655.                         DO embedednum with fonts.subon, 19, m.supersize
  656.                         DO embedednum with _pdparms[19], 19, m.movement
  657.                         DO embedednum with fonts.suboff, 20, m.g_pdfontsize
  658.                         DO embedednum with _pdparms[20], 20, m.movement
  659.                         
  660.                     ELSE
  661.                         _pdparms[17] = fonts.superon
  662.                         _pdparms[18] = fonts.superoff
  663.                         _pdparms[19] = fonts.subon
  664.                         _pdparms[20] = fonts.suboff
  665.                         
  666.                     ENDIF
  667.                     
  668.                     _pdparms[45] = ALLTRIM(fonts.regular)
  669.                     _pdparms[49] = fonts.inch_point
  670.                     _pdparms[51] = fonts.num_width * _pdparms[44] * fonts.dpi
  671.                     IF NOT EMPTY(fonts.horzmove1)
  672.                         _pdparms[23] = RTRIM(fonts.horzmove1)
  673.                         _pdparms[24] = RTRIM(fonts.horzmove2)
  674.                     ENDIF
  675.                     
  676.                     IF NOT EMPTY(p_codes.p_lpi) AND fonts.scalable
  677.                         DO embedednum WITH p_codes.p_lpi, 7, ALLTRIM(STR(m.g_pdleading / 1.5,5,2))
  678.                     ENDIF
  679.                     
  680.                 *
  681.                 * Check what size paper and assign appropriate values.
  682.                 *
  683.                 
  684.                         DO CASE
  685.                         CASE m.g_pdpgsize = 1        && 8.5 by 11 paper
  686.                             m.horizpts = 8.5
  687.                             m.vertpts = 11
  688.                             _pdparms[10] = RTRIM(_pdparms[10]) + RTRIM(p_codes.p_letterpg)
  689.                 
  690.                         CASE m.g_pdpgsize = 2        && Legal paper
  691.                             m.horizpts = 8.5
  692.                             m.vertpts = 14
  693.                             _pdparms[10] = RTRIM(_pdparms[10]) + RTRIM(p_codes.p_legalpg)
  694.                 
  695.                         CASE m.g_pdpgsize = 3        && A4 paper
  696.                             m.horizpts = 8.27
  697.                             m.vertpts = 11.69
  698.                             _pdparms[10] = RTRIM(_pdparms[10]) + RTRIM(p_codes.p_a4pg)
  699.                 
  700.                         ENDCASE
  701.                 
  702.                 *
  703.                 * Calculate the Dots per Column.  If fonts.dpi is 0, it will indicate
  704.                 * that a column movement command is used.
  705.                 *
  706.  
  707.                     IF m.g_pdorientation = 1
  708.                         _pdparms[47] = fonts.dpi * m.horizpts
  709.                     ELSE    
  710.                         _pdparms[47] = fonts.dpi * m.vertpts
  711.                     ENDIF
  712.                     
  713.                 ELSE
  714.  
  715.                     DO embedednum with p_codes.p_superon, 17 
  716.                     DO embedednum with p_codes.p_superon, 18
  717.                     _pdparms[45] = ""
  718.                     STORE 0 to _pdparms[49], _pdparms[50], _pdparms[47], _pdparms[51]
  719.  
  720.                 ENDIF    
  721.             
  722.                 
  723.                 USE
  724.                 SELECT p_codes
  725.             ELSE
  726.             
  727.                 _pdparms[45] = ""
  728.                 STORE 0 to _pdparms[49], _pdparms[50], _pdparms[47], _pdparms[44] 
  729.                 
  730.                 DO CASE
  731.                 CASE m.g_pdpgsize = 1        && 8.5 by 11 paper
  732.                     _pdparms[10] = RTRIM(_pdparms[10]) + RTRIM(p_codes.p_letterpg)
  733.                 
  734.                 CASE m.g_pdpgsize = 2        && Legal paper
  735.                     _pdparms[10] = RTRIM(_pdparms[10]) + RTRIM(p_codes.p_legalpg)
  736.                 
  737.                 CASE m.g_pdpgsize = 3        && A4 paper
  738.                     _pdparms[10] = RTRIM(_pdparms[10]) + RTRIM(p_codes.p_a4pg)
  739.     
  740.                 ENDCASE
  741.             ENDIF
  742.     
  743.             m.first = AT("{#",p_topmarg)
  744.             IF m.first > 0
  745.                 _pdparms[40] = LEFT(p_topmarg,m.first-1) + ;
  746.                     ALLTRIM(STR(m.g_pdtmargin)) + ALLTRIM(SUBSTR(p_topmarg, m.first+3))
  747.             ELSE
  748.                 _pdparms[40] = ""
  749.             ENDIF
  750.             _pdparms[41] = m.g_pdtmargin
  751.  
  752.  
  753.         ENDIF
  754.  
  755.  
  756.     *
  757.     * Format the codes in the array (removing trailing blanks and checking
  758.     * for embeded nulls, carriage returns, and line feeds.)
  759.     *
  760.         FOR m.i = 1 to 24
  761.             _pdparms[m.i] = ALLTRIM(_pdparms[m.i])
  762.             m.first = AT("{",_pdparms[m.i])
  763.             DO WHILE m.first > 0
  764.                 m.second = AT("}",_pdparms[m.i])
  765.                 m.string = SUBSTR(_pdparms[m.i], m.first + 1, m.second-m.first-1)
  766.                 DO CASE
  767.                     CASE m.string = "NULL"
  768.                         m.char = CHR(0)
  769.                     CASE m.string = "CR"
  770.                         m.char = CHR(13)
  771.                     CASE m.string = "LF"
  772.                         m.char = CHR(10)
  773.                     OTHERWISE
  774.                         m.first = 0
  775.  
  776.                 ENDCASE
  777.                 IF m.first > 0
  778.                     _pdparms[m.i] = SUBSTR(_pdparms[m.i], 1, first-1) + m.char + ;
  779.                         SUBSTR(_pdparms[m.i],second+1)
  780.                     m.first = AT("{",_pdparms[m.i])
  781.                 ENDIF
  782.             ENDDO
  783.  
  784.         ENDFOR
  785.  
  786.     *
  787.     * Set up the codes for Bold and Italic.  Reset the line counter.
  788.     *
  789.  
  790.         _pdparms[46] = 0
  791.         _pdparms[25] = IIF(m.g_pdstyle = 1, _pdparms[16], _pdparms[15])
  792.         _pdparms[26] = IIF(m.g_pdstroke = 1, _pdparms[12], _pdparms[11])
  793.         _pdparms[27] = 1
  794.         _pdparms[21] = .F.
  795.         _pdparms[28] = 66
  796.  
  797.         =ACOPY(g_pdfiles, _pdparms, 1, 9, 30)
  798.         _pdparms[39] = .F.
  799.         _pdparms[43] = 0
  800.  
  801.  
  802.     USE
  803.     SELECT (m.select)
  804.  
  805.  
  806. *
  807. * If you would like to use the XBase version of the printer drivers,
  808. * uncomment the line below
  809. *         _PDRIVER = "DRIVER.PRG"
  810.  
  811.  
  812. * and make the line below a comment.
  813.         _PDRIVER = "DRIVER2.PLB"
  814.  
  815.  
  816.     ENDIF
  817.  
  818.     IF TYPE("_pdparms") != "N" OR (TYPE("_pdparms") = "N" AND _pdparms != -1)
  819.         _PDSETUP = "-" + ALLTRIM(m.g_pdname)
  820.     ELSE
  821.         DO alrt WITH "Druckertreiber konnte nicht installiert werden."
  822.     ENDIF
  823.  
  824. RETURN
  825.  
  826.  
  827.  
  828. *!*********************************************************************
  829. *!
  830. *!      Procedure: EMBEDEDNUM
  831. *!
  832. *!      Called by: SETPDRIVER         (procedure in GEN_PD.PRG)
  833. *!
  834. *!*********************************************************************
  835. PROCEDURE embedednum
  836. PARAMETER m.field, m.element, m.embed
  837. PRIVATE m.first
  838.  
  839.     m.first = AT("{#}", m.field)
  840.     IF m.first > 0
  841.         _pdparms[m.element] = LEFT(m.field, m.first - 1) + ;
  842.             m.embed + RTRIM(SUBSTR(m.field, m.first + 3))
  843.     ELSE
  844.         _pdparms[m.element] = m.field
  845.     ENDIF
  846.     
  847. RETURN
  848.  
  849.  
  850.  
  851. *!*********************************************************************
  852. *!
  853. *!      Procedure: ALRT
  854. *!
  855. *!      Called by: GEN_PD.PRG
  856. *!               : SETPDRIVER         (procedure in GEN_PD.PRG)
  857. *!               : LOCATEPD()         (function  in GEN_PD.PRG)
  858. *!               : M.g_saved valid()  (function  in PD_EDIT.SPR)
  859. *!
  860. *!*********************************************************************
  861. PROCEDURE alrt
  862. PARAMETER m.message
  863. PRIVATE m.remove, m.extended
  864.  
  865.  
  866.     DEFINE WINDOW _pvz0lhvmg ;
  867.         FROM INT((SROW()-7)/2),INT((SCOL()-50)/2) ;
  868.         TO INT((SROW()-7)/2)+6,INT((SCOL()-50)/2)+49 ;
  869.         FLOAT ;
  870.         NOCLOSE ;
  871.         SHADOW ;
  872.         DOUBLE ;
  873.         COLOR SCHEME 7
  874.  
  875.     ACTIVATE WINDOW _pvz0lhvmg
  876.  
  877.     m.extended = IIF(ATC("(X)", VERSION()) != 0, .T., .F.)
  878.  
  879.     IF (m.extended AND RDLEVEL() != 5) OR (NOT m.extended AND RDLEVEL() < 4)
  880.  
  881.         m.remove = 1
  882.  
  883.         @ 1,0 SAY PADC(m.message, 48, " ")
  884.         @ 4,17 GET m.remove ;
  885.             PICTURE "@*HT \!\<OK" ;
  886.             SIZE 1,12,10 ;
  887.             DEFAULT 1
  888.  
  889.         READ CYCLE MODAL
  890.  
  891.     ELSE
  892.  
  893.         WAIT PADC(m.message, 48, " ")
  894.  
  895.     ENDIF
  896.  
  897.  
  898.     RELEASE WINDOW _pvz0lhvmg
  899.  
  900. RETURN
  901.  
  902. *!*****************************************************************
  903. *!
  904. *!      Procedure: HELPED
  905. *!
  906. *!*****************************************************************
  907. PROCEDURE helped
  908. PARAMETER m.topic
  909.  
  910. PUSH KEY CLEAR
  911. HELP &topic
  912. POP KEY
  913.  
  914. RETURN
  915.  
  916.  
  917. *!*********************************************************************
  918. *!
  919. *!      Procedure: CLEANUP
  920. *!
  921. *!      Called by: GEN_PD.PRG
  922. *!
  923. *!*********************************************************************
  924. PROCEDURE cleanup
  925.  
  926.     IF NOT EMPTY(m.g_foxuser)
  927.         SELECT (m.g_foxuser)
  928.         USE
  929.     ENDIF
  930.  
  931.     SELECT (m.workarea)
  932.     IF USED()        && Re-establish any relations that might have been set
  933.         IF !EOF()
  934.             GO RECNO()
  935.         ENDIF
  936.     ENDIF
  937.     
  938.     IF NOT EMPTY(m.g_setfields)
  939.         SET FIELDS TO &g_setfields
  940.     ENDIF
  941.  
  942.     IF NOT m.deleted
  943.         SET DELETED OFF
  944.     ENDIF
  945.  
  946.     IF m.trbetween = "ON"
  947.         SET TRBET ON
  948.     ENDIF
  949.  
  950.     IF m.talk
  951.         SET TALK ON
  952.     ENDIF
  953.  
  954.     IF m.escape
  955.         SET ESCAPE ON
  956.     ENDIF
  957.  
  958.     IF NOT m.exact
  959.         SET EXACT OFF
  960.     ENDIF
  961.  
  962.     POP KEY
  963.     SET POINT TO m.merk_p
  964.  
  965. RETURN
  966. *: EOF: GEN_PD.PRG
  967.