Printing in Delphi without using the TPrinter Unit

Question:

How can I print in Delphi without using the TPrinter Unit?

Answer:

The following example uses the Windows API function PrintDlg() to allow the user to choose a printer and prints two pages using the returned dc.

Example:

uses CommDlg;

 

{$IFNDEF WIN32}

 const MAX_PATH = 144;

{$ENDIF}

 

procedure TForm1.Button1Click(Sender: TObject);

var

  Pd : TPrintDlg;

  DocInfo: TDocInfo;

begin

  FillChar(Pd, sizeof(Pd), #0);

  Pd.lStructSize := sizeof(Pd);

  Pd.hWndOwner := Form1.Handle;

  Pd.Flags := PD_RETURNDC;

  if PrintDlg(pd) then begin

  FillChar(DocInfo, sizeof(DocInfo), #0);

  DocInfo.cbSize := SizeOf(DocInfo);

  GetMem(DocInfo.lpszDocName, 32);

  GetMem(DocInfo.lpszOutput, MAX_PATH);

  lStrCpy(DocInfo.lpszDocName, 'My Document');

  {Add this line to print to a file }

  lStrCpy(DocInfo.lpszOutput, 'C:\Download\Test.doc');

  StartDoc(Pd.hDc, DocInfo);

  StartPage(Pd.hDc);

  TextOut(Pd.hDc, 100, 100, 'Page 1', 6);

  EndPage(Pd.hDc);

  StartPage(Pd.hDc);

  TextOut(Pd.hDc, 100, 100, 'Page 2', 6);

  EndPage(Pd.hDc);

  EndDoc(Pd.hDc);

  FreeMem(DocInfo.lpszDocName, 32);

  FreeMem(DocInfo.lpszOutput, MAX_PATH);

  end;

end;