Как использовать клавишу-акселератор в TTabSheets (TPageControl)
Как использовать клавишу-акселератор в TTabSheets (TPageControl)
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;
Взято с сайта: http://www.swissdelphicenter.ch
Можно перехватить сообщение CM_DIALOGCHAR
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;
http://delphiworld.narod.ru/
DelphiWorld 6.0
TPageControl, расположенный на закладке Win95 палитры компонентов, в настоящий момент не может работать с акселераторами. Тем не менее, в наших силах создать потомок TPageControl, поддерживающий вышеназванную характеристику.
В приведенном ниже коде показана реализация такого компонента. Наследник TPageControl осуществляет захват и обработку сообщения CM_DIALOGCHAR. Это позволяет перехватывать комбинации клавиш, которые могут быть акселератороми для данной формы. Обработчик со бытия CMDialogChar использует функцию IsAccel, которая позволяет определить, имеет ли отношение перехваченный код клавиш к акселератору одной из страниц TPageControl. В этом случае делаем страницу активной и передаем ей фокус.
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.
http://delphiworld.narod.ru/ DelphiWorld 6.0
Отправить комментарий