Читать «Советы по Delphi. Версия 1.0.6» онлайн - страница 44

Валентин Озеров

protected

 procedure ReadState(Reader: TReader); override;

 procedure Paint; override;

public

 constructor Create(AOwner: TComponent); override;

published

 property Caption;

 property Height stored False;

 property TabOrder stored False;

 property Visible stored False;

 property Width stored False;

end;

Теперь, по аналогии с вышеприведенной процедурой, попробуем добавить кнопку на TNotebook. Все, что мы должны сделать – заменить "TTabbedNotebook" на "TNotebook" и "TTabPage" на "TPage". Вот что должно получиться:

{ Данная процедура добавляет кнопку в случайной позиции на }

{ текущей странице данного TNotebook.                      }

procedure AddButton(Notebook1: TNotebook);

var

 page: TPage;

 button: TButton;

begin

 with Notebook1 do page:= TPage(Pages.Objects[PageIndex]);

 button:= TButton.Create(page);

 try

  with button do begin

   Parent:= page;

   Left:= Random(page.ClientWidth – Width);

   Top:= Random(page.ClientHeight – Height);

  end;

 except

  button.Free;

 end;

end;

Остальное не менее просто!

Недоступная закладка в компоненте Tabbednotebook

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

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

with TabbedNotebook do Pages.Delete(PageIndex);

и снова включить ее (при необходимости), перегрузив форму.

Блокировка (а не удаление) немного мудренее, поскольку необходима организация цикла в процедуре создания формы, присваивающая имена закладкам компонента TabbedNotebook. Например так:

J:= 0;

with TabbedNotebook do for I:= 0 to ComponentCount - 1 do if Components[I].ClassName = 'TTabButton' then begin

 Components[I].Name:= ValidIdentifier(TTabbedNotebook(Components[I].Owner).Pages[J]) + 'Tab';

 Inc(J);

end;

где ValidIdentifier ValidIdentifier – функция, которая возвращает правильный Pascal-идентификатор, производный от строки 'Tab':

function ValidIdentifier(theString: str63): str63;

{--------------------------------------------------------}

{ Конвертирует строку в правильный Pascal-идентификатор, }

{ удаляя все неправильные символы и добавляя символ '_', }

{ если первый символ – цифра                             }

{--------------------------------------------------------}

var

 I, Len: Integer;

begin

 Len:= Length(theString);

 for I:= Len downto 1 do if not (theString[I] in LettersUnderscoreAndDigits) then Delete(theString, I, 1);

 if not (theString[1] in LettersAndUnderscore) then theString:= '_' + theString;

 ValidIdentifier:= theString;

end; {ValidIdentifier}

Затем мы можем сделать закладку компонента TabbedNotebook недоступной:

with TabbedNotebook  do begin

 TabIdent:= ValidIdentifier(Pages[PageIndex]) + 'Tab';

 TControl(FindComponent(TabIdent)).Enabled:= False;

 { Переключаемся на первую доступную страницу: }

 for I:= 0 to Pages.Count – 1 do begin

  TabIdent:= ValidIdentifier(Pages[I]) + 'Tab';

  if TControl(FindComponent(TabIdent)).Enabled then begin

   PageIndex:= I;

   Exit;