Code:

function Form1.ItemAtPos(TabControlHandle : HWND; X, Y : Integer) : Integer;

var

HitTestInfo : TTCHitTestInfo;

HitIndex : Integer;

begin

HitTestInfo.pt.x := X;

HitTestInfo.pt.y := Y;

HitTestInfo.flags := 0;

HitIndex := SendMessage(TabControlHandle, TCM_HITTEST, 0, Longint(@HitTestInfo));

Result := HitIndex;

end;

 

 

Есть ли возможность в компоненте Tabbednotebook сделать какую-либо страницу недоступной? То есть не позволять пользователю щелкать на ней и видеть ее содержимое?

 Да, такая возможность существует. Самый простой путь - удалить страницу, например так:

Code:

with TabbedNotebook do

Pages.Delete(PageIndex);

 

 

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

 

Что делаю я -- располагаю разделяемые элементы управления на форме, а не на конкретной странице TTabbedNotebook. Для того, чтобы сделать это, вам необходимо установить свойство TTabbedNotebook Align на что-то другое, отличное от alClient -- например, если разделяемые элементы управления расположены в нижней части формы, используйте для TTabbedNotebook значение alTop, и отодвиньте нижнюю границу чуть повыше, чтобы в образовавшейся области без труда разместились бы разделяемые элементы управления.

Разместите компоненты Tabset(TabSet1) и Edit (Edit1) на вашей форме. Измените свойство компонента Tabset Tabs для размещения в списке строк следующих четерых закладок:

 

Hello

World

Of

Delphi

 

Создайте обработчик события onChange компонента Edit1 как показано ниже:

 

Что-то аналогичное я делал раньше, тем не менее, вместо Listbox я использовал dbGrid со следующими опциями:

 

[dgAlwaysShowEditor,dgTabs,dgRowSelect,dgAlwaysShowSelection,dgConfirmDelete, dgCancelOnExit]

 

Кроме того, я привел код, который я использовал в ответ на щелчок на закладке, таким образом изменяя запись в dbgrid.

Автор: Mike Scott

 

Проблема с использованием ресурсов в компоненте Notebook? Вы можете обойти это, освобождая дескрипторы окон невидимых страниц компонента. Следующий код поясняет как это можно сделать - я создал обработчик события компонента OnClick, освобождающий дескрипторы невидимых страниц при каждом изменении видимой страницы:

 

 

Code:

type

TForm1 = class(TForm)

private

   procedure CMDialogKey(var msg: TCMDialogKey);

     message CM_DIALOGKEY;

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.DFM}

 

procedure TForm1.CMDialogKey(var msg: TCMDialogKey);

begin

if msg.Charcode <> VK_TAB then

   inherited;

end;

 

procedure TForm1.FormKeyDown(Sender: TObject; var Key:

Word; Shift: TShiftState);

begin

if Key = VK_TAB then

   Form1.Caption := 'Tab Key Down!';

end;