Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как использовать клавишу-акселератор в TTabSheet (TPageControl)

01.01.2007
{ 
  With menus (and labels), If you use the '&' character in the caption of a menu, 
  you can access that menu item with the short cut key. 
  With this code you can do the same thing with TTabSheet objects 
  that are used with TPageControl objects. 
 
  Zugriffstasten ermoglichen die Ausfuhrung eines Menubefehls mit Hilfe der Tastatur. 
  Der Benutzer braucht nur die Taste Alt und den mit dem Zeichen & kombinierten 
  Buchstaben zu drucken. 
 
  Dieser code erlaubt dieselebe Funktionalitat fur ein 
  TTabSheet eines TPageControls. 
}
 
 // in form declaration 
private
   procedure CMDialogChar(var Msg: TWMCHAR); message CM_DIALOGCHAR;
 end;
 
    type
   TPageControlCracker = class(TPageControl);
 
 {...}
 
 implementation
 
   procedure TForm1.CMDialogChar(var Msg: TWMCHAR);
   var
     i: Integer;
   begin
     if (Msg.keydata and $20000000) <> 0 then
     begin
       { Alt key is down }
       with TPageControlCracker(PageControl1) do
         for i := 0 to PageCount - 1 do
         begin
           if IsAccel(Msg.charcode, Pages[i].Caption) then
           begin
             if CanChange then
             begin
               ActivePage := Pages[i];
               Msg.Result := 1;
               Change;
               Exit;
             end; { If }
           end;  { If }
         end; {For}
     end; {If}
     inherited;
   end;

Взято с сайта: https://www.swissdelphicenter.ch


Можно перехватить сообщение CM_DIALOGCHAR

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;
 
 

https://delphiworld.narod.ru/

DelphiWorld 6.0

 


TPageControl, расположенный на закладке Win95 палитры компонентов, в настоящий момент не может работать с акселераторами. Тем не менее, в наших силах создать потомок TPageControl, поддерживающий вышеназванную характеристику.

В приведенном ниже коде показана реализация такого компонента. Наследник TPageControl осуществляет захват и обработку сообщения CM_DIALOGCHAR. Это позволяет перехватывать комбинации клавиш, которые могут быть акселератороми для данной формы. Обработчик со бытия CMDialogChar использует функцию IsAccel, которая позволяет определить, имеет ли отношение перехваченный код клавиш к акселератору одной из страниц TPageControl. В этом случае делаем страницу активной и передаем ей фокус.

unit tapage;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, ComCtrls;
 
type
 
  TAPageControl = class(TPageControl)
  private
    procedure CMDialogChar(var Msg: TCMDialogChar); message CM_DIALOGCHAR;
  end;
 
procedure Register;
 
implementation
 
procedure TAPageControl.CMDialogChar(var Msg: TCMDialogChar);
var
  i: Integer;
  S: string;
begin
  if Enabled then
    for I := 0 to PageCount - 1 do
      if IsAccel(Msg.CharCode, Pages[i].Caption) and
        Pages[I].TabVisible then
      begin
        Msg.Result := 1;
        ActivePage := Pages[I];
        Change;
        Exit; // выход из цикла.
      end;
  inherited;
end;
 
procedure Register;
begin
  RegisterComponents('Test', [TAPageControl]);
end;
 
end.

https://delphiworld.narod.ru/

DelphiWorld 6.0