type
TGSPageControl = class(TPageControl)
private
FNewPageIndex, FNotifyIndex: Integer;
FTab:boolean;
protected
function GetTabFromCursor: Integer;
function CanChange: Boolean; override;
procedure WMKeyDown(var Message: TWMKey); message WM_KEYDOWN;
procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
public
property NewPageIndex: Integer read FNewPageIndex;
constructor Create(AOwner: TComponent); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TGSPageControl]);
end;
{ TGSPageControl }
function TGSPageControl.CanChange: Boolean;
begin
if fTab then FNewPageIndex:=FNotifyIndex else
FNewPageIndex := GetTabFromCursor;
if FNewPageIndex = -1 then
FNewPageIndex := FNotifyIndex;
Result := inherited CanChange;
FNewPageIndex := -1;
fTab:=false;
end;
procedure TGSPageControl.CMDialogKey(var Message: TCMDialogKey);
begin
fTab:=true;
if (Focused or Windows.IsChild(Handle, Windows.GetFocus)) and
(Message.CharCode = VK_TAB) and (GetKeyState(VK_CONTROL) < 0) then
FNotifyIndex := FindNextPage(ActivePage, True, False).TabIndex;
inherited;
end;
function TGSPageControl.GetTabFromCursor: Integer;
var
HitTestInfo: TTCHitTestInfo;
P: TPoint;
begin
GetCursorPos(P);
HitTestInfo.pt := Self.ScreenToClient(P);
HitTestInfo.flags := TCHT_ONITEM;
Result := SendMessage(Self.Handle, TCM_HITTEST, 0, Integer(@HitTestInfo));
end;
procedure TGSPageControl.WMKeyDown(var Message: TWMKey);
begin
with Message do
case Message.CharCode of
37: FNotifyIndex := FindNextPage(ActivePage, False, False).TabIndex;
39: FNotifyIndex := FindNextPage(ActivePage, True, False).TabIndex;
end;
inherited;
end;
end.
Использование:
Code:
procedure TForm1.GSPageControl1Changing(Sender: TObject;
var AllowChange: Boolean);
begin
AllowChange:=GSPageControl1.Pages[GSPageControl1.NewPageIndex].Enabled
end;
Код, который вы предоставили, - это custom компонент TPageControl, предназначенный для блокировки выбора определенных страниц в панели вкладок при нажатии клавиши Tab. Блокирующее поведение реализовано через переопределение метода CanChange и обработку сообщения CMDialogKey.
Вот шаг за шагом, как работает код:
В конструкторе Create, компонент инициализирует свои внутренние переменные состояния: FNotifyIndex в 0, FNewPageIndex в 0 и FTab в False.
Метод CanChange переопределяется для проверки, может ли пользователь изменить текущую выбранную страницу. Если FTab истинно, то это означает, что пользователь нажимает клавишу Tab, одновременно держа Ctrl (как обнаружено в сообщении CMDialogKey). В этом случае FNewPageIndex устанавливается в индекс следующей страницы в панели вкладок. Иначе FNewPageIndex устанавливается в результат вызова метода GetTabFromCursor.
Метод GetTabFromCursor использует функцию API SendMessage для выполнения теста на попадание в клиентскую область панели вкладок по позиции курсора. Это возвращает индекс страницы, которая была нажата (или -1, если не была нажата).
В обработчике сообщения WMKeyDown, компонент проверяет, был ли нажат клавишей Left или Right и обновляет FNotifyIndex соответственно.
В обработчике сообщения CMDialogKey, компонент проверяет, нажимает пользователь клавишу Tab, одновременно держа Ctrl (проверяя состояние виртуальной клавиши VK_CONTROL). Если так, то устанавливается FTab в True и обновляется FNotifyIndex в индекс следующей страницы в панели вкладок.
Пример использования кода демонстрирует, как использовать этот custom компонент. Обработчик события GSPageControl1Changing вызывается каждый раз, когда пользователь пытается изменить выбранную страницу. В этом обработчике параметр AllowChange устанавливается в зависимости от того, является ли новая страница включенной или нет. Если новая страница не включена, то выбор изменяется.
В целом, код предоставляет полезный механизм для блокировки определенных страниц в панели вкладок при нажатии клавиши Tab. Это может быть особенно полезно в ситуациях, когда вам нужно предотвратить выбор конкретной страницы, но все еще позволить пользователю навигировать по вкладкам с помощью мыши или клавиатуры.
Блокирование закладок TPageControl позволяет запретить изменение активной страницы при помощи клавиши Tab или Shift+Tab.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.