Solved

printing diffent fonts in one line

Posted on 1998-10-09
5
293 Views
Last Modified: 2013-12-03
hi,

i have the following problem in D3 under WIN95 /98:
i will print some text, which consists of
different fonts, in one line.
i tried to care for the different text-height,
but the whole text doesn't stand in one line.
The diffence is very large by changing between fonts of
different pitch : variable and fixed.
below is an (simple) example for what i mean.
in the end should be printed in one(!!) line
ABCDEFABCDEF .
But the second part stands a little bit heigher
than the first.

var
a,b:Pchar;
fo1,fo2:Tfont;
il1,il2:integer;
ih1,ih2:integer;
size:Tsize;
x,y:integer;
zz:shortstring;

begin
a:='ABCDEF';
b:='ABCDEF';
fo1:=Tfont.create;
fo1.name:='Times';
fo1.size:=60;
fo1.pitch:=fpvariable;
fo2:=Tfont.create;
fo2.name:='COURIER';
fo2.size:=60;
fo2.pitch:=fpfixed;
x:=100;
y:=200;
printer.BeginDoc;
selectobject(printer.canvas.handle,fo1.handle);
gettextextentpoint32(printer.canvas.handle,a,strlen(a),size);
il1:=size.cx;
ih1:=size.cy;
zz:=strpas(a);
printer.canvas.textout(x,y,zz);
x:=x+il1;
selectobject(printer.canvas.handle,fo2.handle);
gettextextentpoint32(printer.canvas.handle,b,strlen(b),size);
il2:=size.cx;
ih2:=size.cy;
zz:=strpas(b);
y:=y+ih1-ih2;
printer.canvas.textout(x,y,zz);
printer.enddoc;
fo1.free;
fo2.free;
end;

What is the reason and what can i do ??

thanks
titz

0
Comment
Question by:titz
  • 3
5 Comments
 
LVL 1

Accepted Solution

by:
Roadrunner100598 earned 50 total points
ID: 1342384
Hello titz,

try this...

place a button and two lables on a form.


procedure TForm1.Button1Click(Sender: TObject);
var
  ARect      : TRect;
  Textmetric : TTextmetric;
  Ascent     : integer;
begin
  ARect:=Rect(100,100,1000,1000);
  Canvas.Font.Name :='Times';
  Canvas.Font.Size :=30;
  Canvas.Font.Style:=[fsBold];
  GetTextMetrics(Canvas.Handle, Textmetric);

  { Determin distance  'top - basline' for first font... }
  Ascent:=Textmetric.tmAscent;
  DrawText(Canvas.Handle, 'AaGg', -1, ARect, DT_CalcRect or DT_BOTTOM);
  DrawText(Canvas.Handle, 'AaGg', -1, ARect, DT_BOTTOM);
  label1.Caption:=format('%d  %d  %d  %d', [ARect.Top, ARect.Bottom, ARect.Left, ARect.Right]);

  Canvas.Font.Name :='Courier';
  GetTextMetrics(Canvas.Handle, Textmetric);
  { Offset by width of text and correct for baseline change in second font }
  OffsetRect(ARect, ARect.Right-ARect.Left, Ascent-Textmetric.tmAscent);
  DrawText(Canvas.Handle, 'AaGg', -1, ARect, DT_CalcRect or DT_BOTTOM);
  DrawText(Canvas.Handle, 'AaGg', -1, ARect, DT_BOTTOM);
  label2.Caption:=format('%d  %d  %d  %d', [ARect.Top, ARect.Bottom, ARect.Left, ARect.Right]);
end;

The main trick is the GetTextmetrics( ) to find the different baselines of the fonts. The rest is relatively simple. I prefer the use of DrawText( ), because it has much more flexibility than TextOut( ).



Hope you like this,

beep, beep

Roadrunner
0
 
LVL 1

Expert Comment

by:borup
ID: 1342385
You can also consider printing through the TRichEdit component which seems to take care of the baseline problem.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    PrintButton: TButton;
    procedure PrintButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.PrintButtonClick(Sender: TObject);
var fo1, fo2  : TFont;
begin
  //Font 1
  fo1:=TFont.Create;
  fo1.name:='Times';
  fo1.size:=60;
  fo1.pitch:=fpvariable;

  //Font 2
  fo2:=TFont.Create;
  fo2.name:='COURIER';
  fo2.size:=60;
  fo2.pitch:=fpfixed;

  with RichEdit1 do
    begin
      RichEdit1.Lines.Add('ABCDEFABCDEF');

      //Change the first ABCDEF to font 1
      SelStart := 0;
      SelLength := 6;
      SelAttributes.Assign(fo1);

      //Change the second ABCDEF to font 2
      SelStart := 6;
      SelLength := 6;
      SelAttributes.Assign(fo2);

      //Print the text
      Print('Document Title');
    end;
end;

end.
0
 
LVL 1

Expert Comment

by:borup
ID: 1342386
You can also consider printing through the TRichEdit component which seems to take care of the baseline problem.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    PrintButton: TButton;
    procedure PrintButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.PrintButtonClick(Sender: TObject);
var fo1, fo2  : TFont;
begin
  //Font 1
  fo1:=TFont.Create;
  fo1.name:='Times';
  fo1.size:=60;
  fo1.pitch:=fpvariable;

  //Font 2
  fo2:=TFont.Create;
  fo2.name:='COURIER';
  fo2.size:=60;
  fo2.pitch:=fpfixed;

  with RichEdit1 do
    begin
      RichEdit1.Lines.Add('ABCDEFABCDEF');

      //Change the first ABCDEF to font 1
      SelStart := 0;
      SelLength := 6;
      SelAttributes.Assign(fo1);

      //Change the second ABCDEF to font 2
      SelStart := 6;
      SelLength := 6;
      SelAttributes.Assign(fo2);

      //Print the text
      Print('Document Title');
    end;
end;

end.
0
 
LVL 1

Expert Comment

by:borup
ID: 1342387
Sorry for submitting my comment twice :-)
0
 
LVL 1

Author Comment

by:titz
ID: 1342388
thanks roadrunner,
that was what i was looking for !
titz
0

Featured Post

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…

776 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question