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
|