카테고리 없음

[일반/컴포넌트] TMemo 를 화면크기로 인쇄하기

[롯벨] 2023. 9. 11. 10:12
{+------------------------------------------------------------
| Procedure PrintMemo
|
| Parameters:
| aMemo: memo to print
| centerVertical: true if output should be centered vertically
| centerHorizontal: true if output should be centered horizontally
| Call method:
| static
| Description:
| Prints the contents of a memo on the currently selected
| printer, using the memos Font. The output can be centered
| vertically and/or horizontally. Default margins will be used.
| If the text does not fit onto one page the centerVertical
| parameter is ignored.
| Error Conditions:
| none
| Note:
| requires Printers in the Uses clause.
|Created: 27.10.97 13:16:46 by P. Below
+------------------------------------------------------------}
Procedure TPostForm.PrintMemo( aMemo: TMemo;
                     centerVertical, centerHorizontal: Boolean );
Var
  topMargin, bottomMargin, leftMargin, rightMargin: Integer;
  x,y: Integer;
  maxLineLength: Integer;
  linecounter: Integer;
  lineheight : Integer;
Begin
  { Set the default margins to 1 inch for top, bottom, 0.75 inch
    for left and right margins. GetDeviceCaps is used to get the
    printers resolution (dots per inch). The margin variables
    contain the position of the margin on paper, in dots, not the
    distance from the border of the printing region! }
  topMargin := GetDeviceCaps( Printer.Handle, LOGPIXELSY );
  bottomMargin := Printer.PageHeight - topMargin;

  leftMargin := GetDeviceCaps( Printer.handle, LOGPIXELSX ) * 3 div 4;
  rightMargin := Printer.PageWidth - leftMargin;

  { Start the print job, assign the memo font to the printer canvas.
    Note that we have to make sure the print job is closed properly,
    thus the try finally block. }
  Printer.BeginDoc;
  try
    Printer.Canvas.Font.PixelsPerInch :=
      GetDeviceCaps( Printer.Canvas.Handle, LOGPIXELSY );
      { This is really only necessary for Delphi 1, due to a
        buglet. }
    Printer.Canvas.Font:= aMemo.Font;

    { Determine the height of a line in pixels }
    lineHeight := Printer.Canvas.TextHeight('Ay');

    If centerHorizontal Then Begin
      { Iterate once over all lines of the memo and determine the
        length, in pixels, of the longest line. We need that to
        adjust the leftMargin to center the text. }
      maxLineLength := 0;
      For linecounter := 0 To aMemo.Lines.Count-1 Do Begin
        x:= Printer.Canvas.TextWidth( aMemo.Lines[linecounter]);
        If x > maxLineLength Then
          maxLineLength := x;
      End; { For }

      { Adjust the leftMargin to center the text into the
        available space between the current margins. }
      x := leftMargin +
           (rightMargin-leftMargin-maxLineLength) div 2;
      If x < leftMargin Then Begin
        { Problem, longest line does not fit into the available
          space! We leave the margin untouched, the line will
          be truncated. }
      End { If }
      Else
        leftMargin := x;
    End; { If }

    If centerVertical Then Begin
      { Calculate the vertical space needed to print all lines,
        adjust the topMargin to center the text as needed. }
      y := lineHeight * aMemo.Lines.Count;
      If y < (bottomMargin - topMargin) Then Begin
        topMargin :=
          topMargin + (bottomMargin - topMargin - y) div 2;
      End; { If }
      { Else
          space needed is larger than the height of a page,
          so ignore the center request. }
    End; { If }

    { Margins have been calculated, so we are finally set up
      to start printing lines. In the following code x and y
      hold the starting position of the next line. }
    x:= leftMargin;
    y:= topMargin;
    For linecounter := 0 To aMemo.Lines.Count-1 Do Begin
      Printer.Canvas.TextOut( x, y, aMemo.Lines[linecounter]);
      y := y + lineHeight;
      If y >= bottomMargin Then Begin
        { Eject the page and start a new one, but only if
          the line we have just printed is not the last line
          anyway. EndDoc will eject the current page. }
        If linecounter < (aMemo.Lines.Count-1) Then Begin
          Printer.NewPage;
          y:= topMargin;
        End;
      End; { If }
    End; { For }
  finally
    Printer.EndDoc;
  end;
End; { PrintMemo }