home *** CD-ROM | disk | FTP | other *** search
/ Windows Shareware GOLD / NuclearComputingVol3No1.cdr / _bbs4 / f1498.zip / PRINTER.PAS < prev    next >
Pascal/Delphi Source File  |  1991-08-06  |  6KB  |  259 lines

  1. {$V-,F+}
  2. {.LW 132}
  3. UNIT printer;
  4. INTERFACE
  5. USES WObjects,WinTypes,WinProcs,Strings,WinDos,PDevice;
  6. Type
  7.   pPrnDialog = ^tPrnDialog;
  8.   tPrnDialog = object(tDialog)
  9.     Procedure cancel(var msg: tMessage); virtual id_First + id_Cancel;
  10.   End;
  11.  
  12.   pPrinter = ^tPrinter;
  13.   tPrinter = object(tprnDevice)
  14.     maxX:  word;                {max width of page}
  15.     maxY:  Word;                {max height of page}
  16.     posX:        Word;            {current column}
  17.     posY:         Word;            {current row}
  18.     metrics: TTextMetric;        {text metric information}
  19.     okToPrint: Boolean;
  20.     lpAbortProc: tFarProc;
  21.     hInst: tHandle;
  22.     theParent: pWindowsObject;
  23.  
  24.     constructor Init(inst: tHandle;par: pWindowsObject);
  25.     Function Start(dName: pChar;hw: hWnd): Boolean; virtual;
  26.     Function CheckStart: Boolean; virtual;
  27.     Function newAbortProc: Boolean; virtual;
  28.   Function print(aStr: pChar): Boolean; virtual;
  29.     Function PrintLine(aStr: pChar): Boolean; virtual;
  30.   Function printString(aStr: pChar): Boolean; virtual;
  31.     Function Finish: Boolean; virtual;
  32.     Function pageSize(var ps: tPoint): Boolean; virtual;
  33.     Function height: word; virtual;
  34.     Function newLine: Boolean; virtual;
  35.     Function checkNewPage: Boolean; virtual;
  36.     Function newPage: Boolean; virtual;
  37.     Function resetPos: Boolean; virtual;
  38.     Function doNewFrame: Boolean; virtual;
  39.   Function printDlg: Boolean; virtual;
  40.   Function removeDialog: Boolean; virtual;
  41.   Function stopPrinter: Boolean; virtual;
  42.   Function LineWidth(aStr: pChar): Integer; virtual;
  43.   Function textWidth: Integer; virtual;
  44.   Function textHeight: Integer; virtual;
  45.   End;
  46.  
  47. IMPLEMENTATION
  48. {$R prt.res}
  49. var
  50.   userAbort: Boolean;
  51.   printDialog: pPrnDialog;
  52.  
  53. (***********************************************************)
  54. Function AbortProc(hPrnDC: hDC; nCode: Word): Boolean;Export;
  55. var
  56.   prnMsg: tMsg;
  57.  
  58. Begin
  59.   While not userAbort and PeekMessage(prnMsg,0,0,0,pm_Remove) do begin
  60.     if not IsDialogMessage(PrintDialog^.hWindow,prnMsg) then begin
  61.       TranslateMessage(prnMsg);
  62.       DispatchMessage(prnMsg);
  63.     End;
  64.   End;
  65.   abortProc := not UserAbort;
  66. End;
  67.  
  68. Procedure tPrnDialog.Cancel(var Msg: tMessage);
  69. Begin
  70.   userAbort := True;
  71. end;
  72.  
  73. Constructor tPrinter.Init(inst: tHandle; par: pWindowsObject);
  74. Begin
  75.   tPrnDevice.Init;
  76.   theParent := par;
  77.   hInst := inst;
  78.   UserAbort := False;
  79. End;
  80.  
  81. Function tPrinter.Start;
  82. var
  83.   ap: tPoint;
  84.  
  85. Begin
  86.   hWindow := Hw;            {save the parent window. Seemed like a good idea}
  87.   hPrintDC := 0;            {init the device context to 0}
  88.   GlobalCompact(0);            {compacts global memory}
  89.   if (getPrinterParms and DCcreated) then begin
  90.     docName := dName;
  91.     getTextMetrics(hPrintDC,Metrics);
  92.     pageSize(ap);
  93.     maxX := ap.x-1;
  94.     maxY := ap.y-1;
  95.     start := CheckStart;
  96.   end
  97.   else
  98.     start := false;
  99. End;
  100.  
  101. Function tPrinter.printDlg;
  102. Begin
  103.   printDlg := false;
  104.   printDialog := new(pPrnDialog,Init(TheParent,'PrintDlgBox'));
  105.   if (printDialog <> nil) then begin
  106.     printDlg := printDialog^.Create;
  107.   End;
  108.   printDlg := true;
  109. End;
  110.  
  111. Function tPrinter.RemoveDialog;
  112. Begin
  113.  printDialog^.Destroy;
  114.  dispose(printDialog,Done);
  115. End;
  116.  
  117. Function tPrinter.CheckStart;
  118. Begin
  119.   OkToPrint := false;
  120.   if printDlg then begin
  121.     if newAbortProc then begin
  122.       enableWindow(getParent(hWindow),false);
  123.       if BeginDoc then
  124.         okToPrint := true
  125.       else begin
  126.         deleteContext;
  127.         removeDialog;
  128.         enableWindow(getParent(hWindow),true);
  129.         freeProcInstance(lpAbortProc);
  130.         prnError(prnStartError);
  131.       End;
  132.     End else begin
  133.       deleteContext;
  134.       removeDialog;
  135.       prnError(abortProcError);
  136.     End;
  137.   end else begin
  138.     deleteContext;
  139.     prnError(prnDlgError);
  140.   End;
  141.   checkStart := okToPrint;
  142. End;
  143.  
  144. Function tPrinter.NewAbortProc;
  145. begin
  146.   lpAbortProc := makeProcInstance(@abortProc,hInst);
  147.   newAbortProc := (CallEscape(SetAbortProc,0,lpAbortProc,nil) > 0);
  148. end;
  149.  
  150. Function tPrinter.lineWidth(aStr: pChar): Integer;
  151. Begin
  152.   if (aStr <> nil) then
  153.     LineWidth := (lo(GetTextExtent(hPrintDC,aStr,strLen(aStr))))
  154.   else
  155.     LineWidth := 0;
  156. End;
  157.  
  158. Function tPrinter.Print(astr: pChar): Boolean;
  159. var
  160.   extent: Integer;
  161.  
  162. Begin
  163.   extent := lineWidth(aStr);
  164.   if ((PosX + extent) > maxX) then
  165.     newLine;
  166.   if printString(aStr) then begin
  167.     PosX := PosX + Extent;
  168.     print := true;
  169.   End else
  170.     print := false;
  171. End;
  172.  
  173. Function tPrinter.PrintLine(aStr: pChar): Boolean;
  174. Begin
  175.   if print(aStr) then begin
  176.     newLine;
  177.     printLine := true;
  178.   End else
  179.     printLine := false;
  180. End;
  181.  
  182. Function tPrinter.PrintString(aStr: pChar): Boolean;
  183. Begin
  184.   if OkPrint then
  185.     PrintString := TextOut(hPrintDC,posX,posY,aStr,strLen(aStr))
  186.   else
  187.     printString := false;
  188. end;
  189.  
  190. Function tPrinter.StopPrinter;
  191. Begin
  192.   enableWindow(getParent(hWindow),true);
  193.   removeDialog;
  194.   okToPrint := false;
  195. End;
  196.  
  197. Function tPrinter.Finish;
  198. Begin
  199.   endOfFile;
  200.   stopPrinter;
  201.   freeProcInstance(lpAbortProc);
  202. End;
  203.  
  204. Function tPrinter.PageSize(var ps: tPoint): Boolean;
  205. Begin
  206.   ps.X := GetDeviceCaps(hPrintDC,HorzRes);
  207.   ps.Y := GetDeviceCaps(hPrintDC,VertRes);
  208. end;
  209.  
  210. Function tPrinter.height: word;
  211. Begin
  212.   height := metrics.tmHeight + metrics.tmExternalLeading;
  213. End;
  214.  
  215. Function tPrinter.NewLine: Boolean;
  216. Begin
  217.   posX := 0;
  218.   posY := posY + height;
  219.   checkNewPage;
  220. End;
  221.  
  222. Function tPrinter.CheckNewPage: Boolean;
  223. Begin
  224.   if (posY > maxY) then
  225.     newPage;
  226. End;
  227.  
  228. Function tPrinter.NewPage: boolean;
  229. Begin
  230.   if okToPrint then begin
  231.     resetPos;
  232.     doNewFrame;
  233.   End;
  234. End;
  235.  
  236. Function tPrinter.ResetPos: Boolean;
  237. Begin
  238.   posX := 0;
  239.   posY := 0;
  240. End;
  241.  
  242. Function tPrinter.doNewFrame: Boolean;
  243. Begin
  244.   if OkPrint then
  245.     doNewFrame := tPrnDevice.doNewFrame;
  246. End;
  247.  
  248. Function tPrinter.textWidth: Integer;
  249. Begin
  250.   textWidth := metrics.tmAveCharWidth;
  251. End;
  252.  
  253. Function tPrinter.textHeight: Integer;
  254. Begin
  255.   textHeight := metrics.tmHeight;
  256. End;
  257.  
  258. end.
  259.