How To…Vertically Center Memo Text

Question

“How can I vertically center text in a memo?”

Solution

Report output consists of a collection of Page.DrawCommands[]. Each time the Memo, generates, it creates a DrawCommand that describes the location and content to be rendered. We can use the Memo.OnDrawCommandCreate event to modify the DrawCommand. We can vetically center the wrapped text by inserting some empty lines.

Download:  VeticallyCenterMemoText.zip

Sample Delphi code:

uses
  ppDrwCmd;

procedure TForm1.ppDBMemo1DrawCommandCreate(Sender, aDrawCommand: TObject);
var
 lDrawText: TppDrawText;
 liMaxLines: Integer;
 liAddLines: Integer;
 liIndex: Integer;
begin

  lDrawText := TppDrawText(aDrawCommand);

  // max lines = DBMemo screen pixel height - font height
  liMaxLines := ppDBMemo1.spHeight div Abs(ppDBMemo1.Font.Height);

  // lines to add = (max lines - wrapped lines) div 2
  liAddLines := (liMaxLines - lDrawText.WrappedText.Count) div 2;

  // insert lines
  for liIndex := 0 to liAddLines-1 do
    lDrawText.WrappedText.Insert(0,'');


end;