Использование:

 

Code:

procedure TForm1.GSPageControl1Changing(Sender: TObject;

var AllowChange: Boolean);

begin

AllowChange:=GSPageControl1.Pages[GSPageControl1.NewPageIndex].Enabled

end;

 

Сам код

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.

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить