Adding accelerator characters to TTabsheets

Question:

How can I make an accelerator character work for a Tabsheet? I put accelerator characters in the captions for each Tabsheet of a PageControl, but when I try to tab the pages using accelerator key, it beeps and does nothing.

Answer:

The following example demonstrates trapping the CM_DIALOGCHAR message to surface the accelerator messages for the tab sheets of a PageControl.

Example:

type

  TForm1 = class(TForm)

  PageControl1: TPageControl;

  TabSheet1: TTabSheet;

  TabSheet2: TTabSheet;

  TabSheet3: TTabSheet;

  private

  { Private declarations }

  procedure CMDialogChar(var Msg:TCMDialogChar);

  message CM_DIALOGCHAR;

 public

  { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.DFM}

 

procedure TForm1.CMDialogChar(var Msg:TCMDialogChar);

var

  i:Integer;

begin

  with PageControl1 do begin

  if Enabled then

  for i := 0 to PageControl1.PageCount - 1 do

  if ((IsAccel(Msg.CharCode, Pages[i].Caption)) and

  (Pages[i].TabVisible)) then begin

  Msg.Result:=1;

  ActivePage := Pages[i];

  exit;

  end;

  end;

  inherited;

end;