Как использовать клавишу-акселератор в TTabsheets? Я добавляю клавишу-акселератор в заголовок каждого Tabsheet моего PageControl, но при попытке переключать страницы этой клавишей программа пикает и ничего не происходит.

 

Можно перехватить сообщение CM_DIALOGCHAR.

 

 

Code:

procedure TForm1.TabbedNotebook1Click(Sender: TObject);

var

myE: TEdit;

begin

with TabbedNotebook1 do

begin

   if PageIndex = 1 then

   begin

     myE := TEdit.Create(Self);

     myE.Left := 12;

     myE.Top := 12;

     myE.Parent := Pages.Objects[PageIndex] as TWinControl;

     myE.Show;

   end;

end;

end;

 

 

procedure TForm1.Button1Click(Sender: TObject);

var

Button2:Tbutton;

begin

button2:=tbutton.create(self);

button2.parent:=TabbedNotebook1.Pages.Object[0] as TTabPage;

button2.setbounds(30,30,60,30);

end;

 

 

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

 

Code:

procedure TForm1.GSPageControl1Changing(Sender: TObject;

var AllowChange: Boolean);

begin

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

end;

 

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

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

Code:

with TabbedNotebook do

Pages.Delete(PageIndex);

 

Автор: Mark Johnson

 

Как во время выполнения программы динамически добавлять и удалять страницы динамически созданного NoteBook?

 

Code:

procedure TForm1.Button1Click(Sender: TObject);

var

NewPage: TWinControl;

begin

TabbedNotebook1.Pages.Add(Edit1.Text);

NewPage := TabbedNotebook1.Pages.Objects[TabbedNotebook1.Pages.Count - 1]

   as TWinControl;

with TLabel.Create(Self) do

begin

   Left := 20;

   Top := 20;

   Caption := '&Телефон: ';

   Parent := NewPage;

end;

with TEdit.Create(Self) do

begin

   Left := 100;

   Top := 20;

   Text := '1-800-555-1212';

   Parent := NewPage;

end;

end;

 

 

 

При добавлении компонентов во время выполнения программы, вам необходимо присвоить для каждого компонента свойству parent (контейнер) _страницу_ компонента notebook, а не сам notebook.

 Вы можете сделать это следующим образом (пример дан для кнопки):

 

Code:

MyButton := TButton.Create( Form1 );  {как обычно...}

...

...

MyButton.Parent := TTabPage( TabbedNotebook1.Pages.Objects[n] );

{ <== где 'n' - индекс желаемой страницы ==> }

Автор: Neil

 

...у меня происходит утечка памяти при изменениях страниц в закладках NoteBook.

 

Вы не "теряете" ресурсы, вы их используете. Вы ИСПОЛЬЗУЕТЕ ресурсы на каждой страницы начиная с первой, которая доступна для вашего созерцания. Я упомянаю это потому, потому что проблема ПОТЕРИ ресурсов относится к другому типу проблемы.

 

Недавно я работал над проблемой показа других *ФОРМ* в главной форме, как если бы они были страницами NoteBook. Форма создается при перелистывании на эту "страницу", и разрушается при ее покидании. Это требует хранения неизменяемой информации, естественно, в главной форме, но это чрезвычайно нетребовательно к ресурсам. Главное, что вы храните поля индивидуальных данных в главной форме с именем "Child", а инициализируете в обработчике события экземпляра TForm2 (или имеющего другое имя, в зависимости от имени вашей первой дочерней формы) OnCreate. Поместите закладки в нижней части формы, и при изменении закладки освобождайте текущего "ребенка", а затем создавайте и делайте ребенком другой соответствующий экземпляр формы.

 

 

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;

 

 

Вот хороший трюк от Xavier Pacheco:

Code:

unit TabDis;

 

interface

 

uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls, TabNotBk;

 

type

TFrmTabDis = class(TForm)

   TabbedNotebook1: TTabbedNotebook;

   Button1: TButton;

   procedure FormCreate(Sender: TObject);

   procedure Button1Click(Sender: TObject);

private

   { Private-Deklarationen }

public

   { Public-Deklarationen }

end;

 

var

FrmTabDis: TFrmTabDis;

 

implementation

 

{$R *.DFM}

 

procedure TFrmTabDis.FormCreate(Sender: TObject);

var

i: integer;

j: integer;

begin

{ Создаем имена для всех Notebook TTabButton }

 

j := 0;

 

with TabbedNotebook1 do

   for i := 0 to ControlCount - 1 do

     if Controls[i].ClassName = 'TTabButton' then

     begin

       Controls[i].Name := Controls[i].ClassName + IntToStr(j);

       Inc(j);

     end;

end;

 

procedure TFrmTabDis.Button1Click(Sender: TObject);

begin

{ Делаем недоступной определенную страницу notebook }

with TControl(TabbedNotebook1.FindComponent('TTabButton2')) do

   Enabled := not Enabled;

end;

 

end.

 

 

 

 

Code:

procedure TForm1.Button1Click(Sender: TObject);

var

n: integer;

p: integer;

begin

ListBox1.Clear;

with Notebook1 do

   begin

     for n := 0 to ControlCount - 1 do

       begin

         with TPage(Controls[n]) do

           begin

             ListBox1.Items.Add('Notebook Page: ' +

               TPage(Notebook1.Controls[n]).Caption);

             for p := 0 to ControlCount - 1 do

               ListBox1.Items.Add(Controls[p].Name);

             ListBox1.Items.Add(EmptyStr);

           end;

       end;

   end;

end;

 

В данном документе показана технология динамического добавления страниц компонента PageControl (объектов TTabSheet) к элементу управления Windows 95/NT PageControl (объект TPageControl). Оба этих объекта объявлены в модуле ComCtrls. Поэтому убедитесь в том, что ComCtrls указан в списке используемых модулей.