Читать «Советы по 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;