Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 14 de Janeiro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
102 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Formulários Dinâmicos em Aplicações MDI
Publicado por ActiveDelphi : Sexta, Setembro 15, 2006 - 09:40 GMT-3 (10104 leituras)
Comentários 7 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Gustavo Frassini Olá, active delphianos. Depois de algum tempo estamos de volta. Depois de começar por brincadeira no fórum, venho publicar este artigo sobre como criar Formulários dinamicamente, de uma forma simples, prática e interessante para quem gosta do reuso de código. Então vamos lá...

1º) Criamos uma nova aplicação. Mude as seguintes propriedades do seu Form1:

Caption: Active Delphi - Formulários Dinâmicos;
FormStyle: fsMDIForm;
Name: FormPrincipal;

Neste mesmo formulário, coloque um componente TMainMenu e adicione 3 Itens, como na figura abaixo:


Figura 1 - Menu do formulário principal

Mude as seguintes propriedades do ítem Formulário 01:

Caption: Formulário 01;
Name: Formulrio011;
Hint: frmForm1;
//aqui ficará o nome do form, para chamar dinamicamente.

Mude as seguintes propriedades do ítem Formulário 02:

Caption: Formulário 02;
Name: Formulrio021;
Hint: frmForm2;
//aqui ficará o nome do form, para chamar dinamicamente.

Pronto! No Formulário principal falta só o código. Então salve a aplicação, e antes do código vamos para os outros 2 Form.

Crie um novo formulário, e mude as seguintes propriedades:

Caption: Formulário 01;
Name: frmForm1;
FormStyle: fsMDIChild;

Salve o formulário junto ao projeto e crie mais um Form, mudando as seguintes propriedades:

Caption: Formulário 02;
Name: frmForm2;
FormStyle: fsMDIChild;

Salve novamente e agora vamos ao que interessa. Já que estamos com o frmForm2 aberto, vamos programar o evento onClose do form e registrar a classe, veja como fica sua unit:

unit UfrmForm2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TfrmForm2 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmForm2: TfrmForm2;

implementation

{$R *.dfm}

procedure TfrmForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     Action := caFree; // Destruímos o formulário;
     frmForm2 := nil; // Atribuímos Nil ao frmForm2.
end;

initialization
RegisterClass(TfrmForm2); // Registramos a Classe.

end.

Agora voltemos ao frmForm1, e façamo os mesmos passos do frmForm2:

unit UfrmForm1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TfrmForm1 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmForm1: TfrmForm1;

implementation

{$R *.dfm}

procedure TfrmForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     Action := caFree; // Destruímos o formulário;
     frmForm1 := nil; // Atribuímos Nil ao frmForm2.
end;

initialization
RegisterClass(TfrmForm1); // Registramos a Classe.

end.

Agora falta só o formulário principal, que será responsável pela criação dos outros Formulários.

Primeiro adicionemos as unit’s dos outros dois formulários ao formulário principal. Para tal, selecionemos o formulário principal e vamos ao menu File, Use Unit do delphi, ou pressionemos Alt+F11. Selecione as duas unit’s e confirme. Está criado o vínculo do formulário principal com os outros dois formulários.

Agora vamos ao procedimento de criar os formulários. Para este projeto utilizei o nome de CriarMostrarForm. Segue abaixo seu código:

...

implementation

uses UfrmForm1, UfrmForm2;

{$R *.dfm}

procedure CriarMostrarForm(FormClass: TFormClass; Form: TForm);
var Existe: TForm;
    gind: byte;
begin
     existe := nil; 
     // Vefirica se o formulário já está criado.
     for gind := 0 to Screen.FormCount - 1 do
         if Screen.Forms[gind] is FormClass then
            existe := Screen.Forms[gind];
     // Se o formulário estiver criado, apenas mostra-o;
     if not (existe = nil) then begin
        existe.WindowState:= wsNormal;
        existe.BringToFront;
        existe.SetFocus;
     end else begin
        // Se o formulário não estiver criado, cria-o;
        Application.CreateForm(FormClass,Form);
     end;
end;

Pronto, aqui se vai o mistério. Primeiro pesquisamos se existe algum formulário na aplicação já criado, se ele existir, apenas chamamos e “puxamos” para frente, além de o atribuirmos o foco. Caso o formulário ainda não esteja criado, apenas criamos. Note que os parâmetros de entrada foram usados inclusive na criação do form.

Agora veremos como usar a procedure. Selecione o MenuIterm:Formulrio011 e no seu evento onClick coloque:

CriarMostrarForm( TFormClass( FindClass( 'T' + (Sender as TMenuItem).Hint ) ),
                  TForm( (Sender as TMenuItem).Hint) );

Pronto, agora selecione o componente MenuItem:Formulrio021 e no seu evento onClick, escolha no ComboBox o procedimento Formulrio011Click;


Figura 2 - Selecionando uma procedure para o evento onClick do ítem do menu

Prontinho, veja como ficou nossa unit:

unit frmPrincipal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls;

type
  TFormPrincipal = class(TForm)
    Label1: TLabel;
    MainMenu1: TMainMenu;
    Formulrios1: TMenuItem;
    Formulrio011: TMenuItem;
    Formulrio021: TMenuItem;
    procedure Formulrio011Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormPrincipal: TFormPrincipal;

implementation

uses UfrmForm1, UfrmForm2;

{$R *.dfm}

procedure CriarMostrarForm(FormClass: TFormClass; Form: TForm);
var Existe: TForm;
    gind: byte;
begin
     existe := nil;
     for gind := 0 to Screen.FormCount - 1 do
         if Screen.Forms[gind] is FormClass then
            existe := Screen.Forms[gind];
     if not (existe = nil) then begin
        existe.WindowState:= wsNormal;
        existe.BringToFront;
        existe.SetFocus;
     end else begin
        Application.CreateForm(FormClass,Form);
     end;
end;

procedure TFormPrincipal.Formulrio011Click(Sender: TObject);
begin
  CriarMostrarForm( TFormClass( FindClass( 'T' + (Sender as TMenuItem).Hint ) ),
                    TForm( (Sender as TMenuItem).Hint) );
end;

end.

Agora um último detalhe: excluir os forms da opção auto-create. Para isso, vá o menu View, Unit do delphi (ou pressione Ctrl+F12), selecione o nome do projeto e confirme para ver a unit principal. Exclua as linhas responsáveis por criar os formulários 1 e 2. Você pode ainda ir ao menu Project, Options, na primeira guia(Forms), passe frmForm1 e frmForm2 para o lado direito(Avaliable Forms). Veja como ficou o código da unit do projeto:

program prjFormDinamico;

uses
  Forms,
  frmPrincipal in 'frmPrincipal.pas' {FormPrincipal},
  UfrmForm1 in 'UfrmForm1.pas' {frmForm1},
  UfrmForm2 in 'UfrmForm2.pas' {frmForm2};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TFormPrincipal, FormPrincipal);
  Application.Run;
end.

Bom por enquanto é isso! Espero ter ajudado.

Um abraço a todos os Active Delphianos e aproveitando, gostaria de convidar o pessoal que está por aqui, a participar do nosso fórum, que com a colaboração de todos os usuários, está num nível muito bom.

Até a próxima amigos.

Clique aqui para fazer o download do arquivo.

By Gustavo
Contato: gustavo@topsystem.com.br



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: brainlock : Set 16, 2006 - 07:27
(Informações sobre o membro | Enviar uma mensagem)
No form MDI

procedure TfrmPrincipal.FrmEmpresaClick(Sender: TObject);
begin
// chama cadastro de empresas
if FrmEmpresa = NIL then
FrmEmpresa := TfrmEmpresa.Create(Application)
else begin
FrmEmpresa.BringToFront;
FrmEmpresa.WindowState := wsNormal;
end;
end;

na filhas


procedure TfrmEmpresa.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
frmEmpresa := NIL;
end;

fazer o msm

Agora um último detalhe: excluir os forms da opção auto-create. Para isso, vá o menu View, Unit do delphi (ou pressione Ctrl+F12), selecione o nome do projeto e confirme para ver a unit principal. Exclua as linhas responsáveis por criar os formulários 1 e 2. Você pode ainda ir ao menu Project, Options, na primeira guia(Forms), passe frmForm1 e frmForm2 para o lado direito(Avaliable Forms). Veja como ficou o código da unit do projeto:

Mais simples sem uso de muitas variaveis


Abraços


Hermínio L. Paes Jr.


por: wellson : Jan 23, 2007 - 12:08
(Informações sobre o membro | Enviar uma mensagem)
Muito bom!


por: acvodark (acvodark@yahoo.com.br) : Jun 17, 2008 - 11:55
(Informações sobre o membro | Enviar uma mensagem)
E dá pra adaptar para Aplicações que não usamo MDI?


por: frederico.briga (frederico.brigatte@gmail.com) : Abr 08, 2015 - 09:45
(Informações sobre o membro | Enviar uma mensagem)
Muito bom esse artigo, parabéns. Estou com uma dúvida. Como faço para pegar o nome ou caption desses forms e armazenar numa StringList e mostrar num ShowMessage? Como faz isso? Pode me ajudar?
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados