TTabbedNotebook
Добавление элементов управления в TTabbedNotebook во время проектирования - красивая и простая задача. Все, что Вам нужно - это установить свойство PageIndex или ActivePage на необходимую страницу и начать заполнять ее элементами управления.
Добавление элементов управление во время выполнения приложения также очень просто. Тем не менее, в прилагаемой документации по Delphi вы не найдете рецептов типа Что-и-Как. Видимо для того, чтобы окончательно запутать начинающих программистов, фирма-изготовитель даже не удосужилась включить исходный код TTabbedNotebook в VCL-библиотеку. Таким образом, TTabbedNotebook остается для некоторых тайной за семью печатями. К счастью, я имею некоторый опыт, коим и хочу поделиться.
Первым шагом к раскрытию тайны послужит просмотр файла \DELPHI\DOC\TABNOTBK.INT, интерфейсной секции модуля TABNOTBK.PAS, в котором определен класс TTabbedNotebook. Беглый просмотр позволяет обнаружить класс TTabPage, описанный как хранилище элементов управления отдельной страницы TTabbedNotebook.
Вторым шагом в исследовании TTabbedNotebook может стать факт наличия свойством Pages типа TStrings. В связи с этим отметим, что Delphi-классы TStrings и TStringList соорганизуются с двумя свойствами: Strings и Objects. Другими словами, для каждой строки в TStrings есть указатель на соответствующий Objects. Во многих случаях этот дополнительный указатель игнорируется, нам же он очень пригодится.
После небольшого эксперимента выясняем, что свойство Objects указывает на нашу копию TTabPage и ссылается на имя страницы в свойстве Strings. Блестяще! Всегда полезно знать что ищешь. Теперь посмотрим что мы можем сделать:
{ Данная процедура добавляет кнопку в случайной позиции на } { текущей странице данного TTabbedNotebook. } procedure AddButton(tabNotebook : TTabbedNotebook); var tabpage : TTabPage;button : TButton;begin with tabNotebook dotabpage := TTabPage(Pages.Objects[PageIndex]);button := TButton.Create(tabpage);trywith button do beginParent := tabpage;Left := Random(tabpage.ClientWidth - Width);Top := Random(tabpage.ClientHeight - Height);end;exceptbutton.Free;end;end; |
|
TPage = class(TCustomControl)privateprocedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;protectedprocedure ReadState(Reader: TReader); override;procedure Paint; override;publicconstructor Create(AOwner: TComponent); override;publishedproperty Caption;property Height stored False;property TabOrder stored False;property Visible stored False;property Width stored False;end; |
{ Данная процедура добавляет кнопку в случайной позиции на } { текущей странице данного TNotebook. } procedure AddButton(Notebook1 : TNotebook); var page : TPage;button : TButton;begin with Notebook1 dopage := TPage(Pages.Objects[PageIndex]);button := TButton.Create(page);trywith button do beginParent := page;Left := Random(page.ClientWidth - Width);Top := Random(page.ClientHeight - Height);end;exceptbutton.Free;end;end; |