Delphi: Printing on specific coordinates

Posted by webmaster Guido

In Reply to: Re: Printing calculated results posted by Lionel

: When you say "specifying horizontal and vertical coordinates" Is this what you are talking about:

: GoToXY(1,23);
: WriteLn(F,'Angle: ',Deg.Text, Min.Text, Sec.Text;
: ???


For printing on specific coordinates of the paper, you use this Delphi command:

Printer.Canvas.TextOut(string_to_print, X_coordinate, Y_coordinate)

The entire print-routine looks a bit different though: all printing must be between the commands "Printer.BeginDoc" and "Printer.EndDoc". Here's an example:

procedure TForm1.btnPrintClick(Sender: TObject);
  Printer.BeginDoc; // allways do this first
    Printer.Canvas.Font.Name := 'Arial';
    Printer.Canvas.Font.Size := 12;
    Printer.Canvas.TextOut(500, 500, 'line1-column1');
    Printer.Canvas.TextOut(1500, 500, 'line1-column2');
    Printer.Canvas.TextOut(500, 600, 'line2-column1');
    Printer.Canvas.TextOut(1500, 600, 'line2-column2');
    // more printing here...
    Printer.EndDoc; // this starts the printing

Because you use coordinates that are expressed in pixels, the printout will look different from printer to printer, it depends on the printer's pixel density (dots per inch, "DPI"). For a reliable result, you go like this:

- decide on the size of the topmargin and position of the column(s) in inches;
- find out the printer's resolution in the horizontal and vertical direction;
- convert measurements from inches to pixels;
- set the desired font and calculate the corresponding linespacing;
- for each line, calculate the vertical position and give TextOut commands.

Here's a code sample for a printout with a topmargin of 1 inch, and using two columns: the first at 0.8 inch, the second at 2.2 inch from the left side:

procedure TForm1.btnPrintClick(Sender: TObject);
  Col1Position = 0.8; // in inches
  Col2Position = 2.2; // in inches
  TopMargin = 1; // in inches
  PixPerInchX, PixPerInchY: integer; 
  X1, X2, Y, LineSpacing: integer; // in pixels
    with Printer.Canvas do begin
      PixPerInchX := GetDeviceCaps(Handle, LOGPIXELSX);
      PixPerInchY := GetDeviceCaps(Handle, LOGPIXELSY);    
      X1 := Round(Col1Position * PixPerInchX);
      X2 := Round(Col2Position * PixPerInchX);
      Y := Round(TopMargin * PixPerInchY);
      Font.Name := 'Arial';
      Font.Size := 12;
      LineSpacing := Round(TextHeight('X') * 1.05); // or 1.5 or 2 or whatever...
      TextOut(X1, Y, 'line1-column1');
      TextOut(X2, Y, 'line1-column2');
      Y := Y + LineSpacing;
      // more printing here...
    Printer.EndDoc; // print and advance to new page

Related Articles and Replies:

[ Delphi FAQ ] [ Delphi Tutorials ]