How To…Format Text With Ellipse

Question

“How can I append a ‘…’ to the end of text that is too wide to fit the bounds of a control?”

Solution

ReportBuilder 12 introduced the TppCustomText.Ellipsis property to automatically truncate text too wide to fit in a given area.  Below is an example of performing this task for versions earlier than RB 12.

The following example shows how to calculate the width of text and truncate it with a ‘…’ when the text is too wide to fit.

Download: FormatTextWithEllipse.zip

 

uses
  ppUtils,
  ppTypes;


procedure TForm1.ppDetailBand1BeforePrint(Sender: TObject);
var
  lsText: String;
begin

  lsText := ppReport1.DataPipeline['Company'];

  ppLabel1.Caption := FormatTextWithEllipse(ppLabel1, lsText);

end;


function TForm1.FormatTextWithEllipse(aLabel: TppLabel; aText: string): string;
const
  csEllipses = '...';
var
  ldTextWidth: Double;
  lsText: String;
begin

  Result := aText;
  lsText := aText;

  ldTextWidth := CalcTextWidthInReportUnits(lsText, aLabel.Font);

  {shrink length of text and add the elipses, as needed}
  if (ldTextWidth > ppLabel1.Width) then
    repeat
      lsText := Copy(lsText,1, Length(lsText)-1);
      Result := lsText + csEllipses;
      ldTextWidth := CalcTextWidthInReportUnits(Result, aLabel.Font);

    until (ldTextWidth < ppLabel1.Width);

end;


function TForm1.CalcTextWidthInReportUnits(aText: String; aFont: TFont): Double;
var
  liPrinterPixels: Integer;
  liMicrons: Integer;
begin

  ppReport1.Printer.Canvas.Font := aFont;

  {calc width in printer pixels}
  liPrinterPixels := ppReport1.Printer.Canvas.TextWidth(aText);

  {convert to microns}
  liMicrons := ppToMMThousandths(liPrinterPixels, utPrinterPixels, pprtHorizontal, ppReport1.Printer);

  {convert from microns to report units}
  Result := ppFromMMThousandths(liMicrons, ppReport1.Units, pprtHorizontal, ppReport1.Printer);


end;