Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > VCL > Блокирование закладок TPageControl


Автор: s-mike 05.02.05, 12:27
Небольшой наследник:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    procedure TForm1.GSPageControl1Changing(Sender: TObject;
      var AllowChange: Boolean);
    begin
     AllowChange:=GSPageControl1.Pages[GSPageControl1.NewPageIndex].Enabled
    end;


Авторы: Rouse_, Krid

Автор: s-mike 07.04.05, 13:59
Решение обсуждалось в этой теме:
TpageControl, чтобы Tab не нажимался

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)