Добавление и удаление страниц Notebook

Материал из DRKB

Добавление и удаление страниц Notebook[править | править код]

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


{ Добавляем новую страницу к NoteBook и новую закладку к tabset
(параметр pagename задает имя страницы), размещаем на странице
компонент Memo и выводим новую страницу на передний план.
Подразумевается, что TabSet (набор закладок) имеет ровно по
одной закладке на каждую страницу NoteBook с точным сохранением порядка. }
procedure AddPage(nbk: TNotebook; Tabset: TTabSet; const PageName: string);
var
  Memo: TMemo;
  Page: TPage;
begin
  if nbk <> nil then
  begin
    nbk.Pages.Add(pagename); { добавляем страницу в TNotebook }
    nbk.PageIndex := nbk.Pages.Count - 1; { делаем новую страницу текущей }
    if Tabset <> nil then
    begin
      Tabset.Tabs.Add(pagename); { добавляем соответствующую закладку }
      Tabset.TabIndex := nbk.PageIndex; { делаем новую закладку текущей }
    end;
   { убедимся что страница существует }
    if nbk.PageIndex > -1 then
    begin
      Page := TPage(nbk.Pages.Objects[nbk.PageIndex]); { получаем объект страницы }
      { создаем TMemo (и страницей в качестве родителя) }
      Memo := TMemo.Create(Page);
      try
        { устанавливаем страницу в качестве Parent }
        Memo.Parent := Page;
        { устанавливаем выравнивание для заполнения области клиента }
        Memo.Align := alClient;
      except
        Memo.Free; { освобождаем TMemo, если что-то идет неправильно }
      end;
      Page.Visible := True; { показываем страницу }
    end;
  end;
end;

{ Удаляем страницу, чей PageIndex = index из nbk и tabset. Подразумевается,
что TabSet имеет ровно по одной закладке на каждую страницу NoteBook с
точным сохранением порядка. }
procedure DeletePage(nbk: TNotebook; Tabset: TTabSet; Index: integer);
var
  SwitchTo: integer;
begin
  if nbk <> nil then
  begin
    if (Index >= 0) and (Index < nbk.Pages.Count) then
    begin
      if Index = nbk.PageIndex then
      begin
        if Index < nbk.Pages.Count - 1 then
        begin { если страница не последняя в списке }
          { выводим страницу за текущей, ставшей ею после удаления }
          SwitchTo := nbk.PageIndex;
          { если первая страница }
          if (Index = 0) and (nbk.Pages.Count > 1) then
            nbk.PageIndex := 1; { теперь показываем вторую страницу }
        end
        else
          { в противном случае показываем страницу, расположенную перед текущей }
          SwitchTo := nbk.PageIndex - 1;
      end;
      { освобождаем страницу и все принадлежавшие ей элементы управления }
      nbk.Pages.Delete(Index);
      if Tabset <> nil then
      begin
        if Index < Tabset.Tabs.Count then
          Tabset.Tabs.Delete(Index); { удаляем соответствующую закладку }
      end;
      nbk.PageIndex := SwitchTo;
    end;
  end;
end;


ID: 01188



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 := '&amp;Телефон: ';
    Parent := NewPage;
  end;
  with TEdit.Create(Self) do
  begin
    Left := 100;
    Top := 20;
    Text := '1-800-555-1212';
    Parent := NewPage;
  end;
end;


Source: http://delphiworld.narod.ru/
ID: 01189