Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Блокирование закладок TPageControl

Delphi , Компоненты и Классы , Вкладки и Страницы

Code:

unit GSPageControl;
 
interface
 
uses
Windows, Messages, Types, SysUtils, Classes, Controls, ComCtrls, CommCtrl;
 
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;
 
constructor TGSPageControl.Create(AOwner: TComponent);
begin
inherited;
FNotifyIndex := 0;
FNewPageIndex := 0;
FTab:=false;
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;

Авторы: Rouse_, Krid

Взято из http://forum.sources.ru

Код, который вы предоставили, - это custom компонент TPageControl, предназначенный для блокировки выбора определенных страниц в панели вкладок при нажатии клавиши Tab. Блокирующее поведение реализовано через переопределение метода CanChange и обработку сообщения CMDialogKey.

Вот шаг за шагом, как работает код:

  1. В конструкторе Create, компонент инициализирует свои внутренние переменные состояния: FNotifyIndex в 0, FNewPageIndex в 0 и FTab в False.
  2. Метод CanChange переопределяется для проверки, может ли пользователь изменить текущую выбранную страницу. Если FTab истинно, то это означает, что пользователь нажимает клавишу Tab, одновременно держа Ctrl (как обнаружено в сообщении CMDialogKey). В этом случае FNewPageIndex устанавливается в индекс следующей страницы в панели вкладок. Иначе FNewPageIndex устанавливается в результат вызова метода GetTabFromCursor.
  3. Метод GetTabFromCursor использует функцию API SendMessage для выполнения теста на попадание в клиентскую область панели вкладок по позиции курсора. Это возвращает индекс страницы, которая была нажата (или -1, если не была нажата).
  4. В обработчике сообщения WMKeyDown, компонент проверяет, был ли нажат клавишей Left или Right и обновляет FNotifyIndex соответственно.
  5. В обработчике сообщения 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Вкладки и Страницы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-26 16:41:17/0.0034909248352051/0