Tabsheet dinâmica no Delphi


Criando tabs dinamicamente no Delphi

Esta é uma dica muito útil caso você queira criar tabs dinamicamentes no Page Control para usar como por exemplo em um editor de textos.

Crie um novo probjeto (File->New->Project / VCL Forms Project).

Adicione um TPageControl (aba Win32).

Adicione um TButton (aba Standard) e defina a propriedade caption como “Adicionar”.

Clique duas vezes no botão adicionado e adicione o seguinte código:

procedure TForm1.Button1Click(Sender: TObject);
var
 TabSheet : TTabSheet;//a tab que será criada
begin
 //criamos a tab, sendo o Owner(pai) o page control
 TabSheet := TTabSheet.Create(PageControl1);
 //definimos o page control pai
 TabSheet.PageControl := PageControl1;
 //damos um nome a ela
 //Num tabs é uma variável do tipo inteiro que pode ser
 //declara na seção public do form
 TabSheet.Name := 'TabSheet' + IntToStr(NumTabs);
 //damos ao titulo da tab o nome da mesma
 TabSheet.Caption := TabSheet.Name;
 //incrementamos o numero de tabs
 //para ser usado na próxima
 Inc(NumTabs);
end;

Trecho onde é declarado a variável NumTabs:

var
 Form1: TForm1;
 NumTabs: integer;

E para inicializar a variável NumTabs, a definimos com 1 no OnCreate do Form:

procedure TForm1.FormCreate(Sender: TObject);
begin
 NumTabs := 1;
end;

Resultado:

Agora que já sabemos criar as tabs dinamicamente, vamos a um exemplo prático! Vamos carregar arquivos de texto em tabs criadas dinamicamente em Memos também criados dinamicamente.

Adicione mais um botão no formulário e defina a propriedade caption como “Abrir”. Adicione também um componente OpenDialog (Aba Dialogs) e defina as propriedades “Filter” para “Arquivos de Texto|*.txt” e “DefaultExt” como “*.txt” (sem as aspas).

Dê um duplo clique no botão e insira o código abaixo:

procedure TForm1.Button2Click(Sender: TObject);
var
 TabSheet : TTabSheet;//a tab que será criada
 Memo : TMemo; //componente que carregará o texto
begin
 //reaproveitamos o código do botão adicionar
 TabSheet := TTabSheet.Create(PageControl1);
 TabSheet.PageControl := PageControl1;
 TabSheet.Name := 'TabSheet' + IntToStr(NumTabs);

 //se for selecionado um arquivo
 if OpenDialog1.Execute then
 //iniciamos a criação da tab e carregamento do arquivo
 begin
 //criamos o memo e definimos como seu owner a tab criada
 Memo := TMemo.Create(TabSheet);
 //definimos o parent do memo como a tab
 Memo.Parent := TabSheet;
 //damos um nome ao memo
 Memo.Name  := 'Memo' + IntToStr(NumTabs);
 //a proprieda Align faz com que ele ocupe todo o tabsheet
 Memo.Align := alClient;
 //mostramos as barras de rolagem
 Memo.ScrollBars := ssBoth;
 //e por fim se o arquivos exists o carregamos
 if FileExists(OpenDialog1.FileName) then
 begin
 Memo.Lines.LoadFromFile(OpenDialog1.FileName);
 //definimos o caption da tab com o nome do arquivo 🙂
 TabSheet.Caption := ExtractFileName(OpenDialog1.FileName);
 end;
 end;
 //incrementamos o contador de abas
 Inc(NumTabs);
 //e aqui setamos a ultima tab como ativa
 PageControl1.ActivePageIndex := PageControl1.PageCount - 1;
end;

Resultado final (fiz alguns ajustes pessoais hehehe :D)

É isso aí pessoal, se gostou não esqueça de comentar e avaliar o post! 🙂

Até a próxima!

Anúncios

8 comentários sobre “Tabsheet dinâmica no Delphi

  1. Pingback: Tabsheet-dinamica-no-Delphi. : Sysmaya
      • amigo, teria como me explicar com um exemplo? Assim, queria saber como salvar o que é digitado em cada aba separadamente, e também salvar as alterações dos textos contidos nas abas. se puderes me ajudar, ficarei eternamente grato!

  2. Olá, bem antigo o artigo, mas, bem bacana!!
    Gostaria de além de criar a tabsheet dinamicamente, criar junto um formulário.

    Como posso fazer isso? Fiz uma alteração no seu código pra testar.
    Tenho frmPrincipal com FrmStyle = fsMDIForm e um frmCliente com FrmStyle = fsMDIChild.

    No frmCliente tem apenas label e um speedbutton que não recebe foco.

    procedure TfrmPrincipal.btIncluirExecute(Sender: TObject);
    var
    TabSheet : TTabSheet;
    begin
    TabSheet := TTabSheet.Create(PageControl1);
    Application.CreateForm(TfrmClientes, frmClientes);
    TabSheet.PageControl := PageControl1;
    TabSheet.Caption := frmClientes.Caption;
    frmClientes.Parent := TabSheet; <<<<<<<<<<< erro aqui Cannot focus a disabled or invisible window.
    frmClientes.Show;
    end;

    não sei como faço pra mostrar o form corretamente.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s