How to implement a multi-line caption on a TButton #81

Question
How do I make a button have a two line caption? I think there is a character or sequence there to embed a linefeed in the caption property.

It is not as simple as adding a #13#10 sequence as a line break in the caption. You also need to add the BS_MULTILINE style. The following sample component will accept a pipe character ("|"") in the caption as proxy for a linebreak. This allows you to specify the break in the designer, which does not accept Return as part of the caption string.

If you want to be able to include #13#10 in a caption using the designer try the Extended String Property Editor IDE extension.
unit MLButton;

interface

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

type
  TMultilineButton = class(TButton)
  private
    FMultiline: Boolean;
    function GetCaption: String;
    procedure SetCaption(const Value: String);
    procedure SetMultiline(const Value: Boolean);
  public
    procedure CreateParams(var params: TCreateParams); override;
    constructor Create(aOwner: TComponent); override;
  published
    property Multiline: Boolean
    	read FMultiline write SetMultiline default True;
    property Caption: String read GetCaption write SetCaption;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('PBGoodies', [TMultilineButton]);
end;

constructor TMultilineButton.Create(aOwner: TComponent);
begin
  inherited;
  FMultiline := True;
end;

procedure TMultilineButton.CreateParams(var params: TCreateParams);
begin
  inherited;
  if FMultiline then
    params.Style := params.Style or BS_MULTILINE;
end;

function TMultilineButton.GetCaption: String;
begin
  Result := Stringreplace( inherited Caption, #13, '|', [rfReplaceAll] );
end;

procedure TMultilineButton.SetCaption(const Value: String);
begin
  if value <> Caption then
  begin
    inherited Caption := Stringreplace( value, '|', #13, [rfReplaceAll] );
    Invalidate;
  end;
end;

procedure TMultilineButton.SetMultiline(const Value: Boolean);
begin
  if FMultiline <> Value then
  begin
    FMultiline := Value;
    RecreateWnd;
  end;
end;

end.
Original resource: The Delphi Pool
Author: Peter Below
Added: 2009/08/24
Last updated: 2009/08/24