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

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
156 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]  MDI - Trabalhando com Frames para criar Forms dinamicamente
Publicado por Borland_Linuxer : Segunda, Dezembro 11, 2006 - 03:01 GMT-3 (8980 leituras)
Comentários 5 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Sérgio Guedes Olá amigos delphianos! Como tem andado os estudos? Bom, nesse artigo irei abordar o uso de frame em aplicações MDI, e para começar, veremos um pouco sobre esta tecnologia.

Sobre MDI

MDI - Multiple Document Interface: Sobre este conceito, podemos ressaltar que:

  • Existe uma janela MDI Mãe (propriedade FormStyle = fsMDIForm), que é a janela principal do projeto, a qual armazenará dentro de si as outras janelas do projeto (janelas filhas).
  • Uma janela MDIForm (mãe) deve ter apenas menu, barra de ferramentas e barra de status, alinhadas nas bordas da janela.
  • Ela deve obrigatoriamente possuir um menu.
  • A área interna do Form (Cliente) , é destinada as janelas filhas (propriedade FormStyle = fsMDIChild), que serão exibidas dentro da janela mãe.
  • Em um projeto MDI, podem existir N janelas filhas, que serão exibidas dentro da janela mãe.
  • As janelas filhas, devem ser criadas no momento que serão exibidas, e liberadas da memória ao serem fechadas.
  • Podem existir também janelas normais, porém o sua exibição deve ser feita com o ShowModal.

Como já aprendemos um pouco sobre o conceito MDI, vamos para a prática.

Criando uma aplicação exemplo

Crie uma pasta onde vamos salvar os fontes desse exemplo e crie uma nova aplicação win32 no Delphi, pelo menu File, New, Application.

Defina o nome do form que é criado junto com o projeto para FrmPrincipal, e salve-o com o nome de UfrmPrincipal. Salve o projeto como prjMDI.

Vamos alterar algumas propriedades do FrmPrincipal:

  • FormStyle: fsMDIForm:
  • Position: poDesktopCenter.

Ainda no form Principal, adicione um componente MainMenu1 para criamos o menu do projeto. Coloque sua propriedade name como mmMdi e faça o menu como abaixo:

Arquivo Cadastro Sistema
Sair Listagem Sobre
  Novo Registro  

Agora vamos criar a nossa tela de cadastro de Cliente. Para isso, crie um frame no menu File, New, Frame.

Logo depois da seção Public, declare a seguinte variável:

  var
    FrmCliente: TFrame; // Declarar o frame como da classe TFrame.

Lembrando que a nossa tela de cadastro será criada no frame, que por sua vez será criada em um form temporário. Não vamos criar um form para cada frame de cadastro.

Altere o nome do frame para frmCliente e coloque alguns componentes para simular uma tela de cadastro.

Obs: Não iremos ligar nada a banco de dados. Essa tela serve somente como ilustração para o exemplo.

Vamos declarar uma variável e uma função no form Principal.Para isso, logo após a declaração do form, coloque:

  var
    FrmPrincipal: TFrmPrincipal;
	 Janela: TForm; //Código Adicionado

Função na seção Public

  function FormTemp(nome: string; parent: TForm; altura, altMin, altMax,
    largura, largMin, largMax: Integer): TForm;

Para criar o seu corpo, pressione ctrl + shift + c

function TFrmPrincipal.FormTemp(nome: string; parent: TForm; altura,
  altMin, altMax, largura, largMin, largMax: Integer): TForm;
var
  FORM : TForm;
begin
  FORM := TForm.Create(nil);
  FORM.Height := altura;
  FORM.Width := largura;
  FORM.Constraints.MinHeight := altMin;
  FORM.Constraints.MaxHeight := altMax;
  FORM.Constraints.MinWidth := largMin;
  FORM.Constraints.MaxWidth := largMax;
  FORM.Caption := nome;
  FORM.FormStyle := fsMDIChild;
  FORM.AutoSize := False;
  FORM.Show;
  Result := FORM;
end;

Criando o form Temporário e o frame dentro dele

No menu Cadastro, escolha a opção novo e realize a chamada para a função:

  Janela := FormTemp('Cadastro de Clientes',FrmPrincipal,261,0,0,483,0,483);
  // A variável declarada acima do tipo TForm recebe o retorno da nossa função
  FrmCliente := TFrmCliente.Create(Janela); //o Frame é criado como filho de Janela
  FrmCliente.Parent := Janela;
  FrmCliente.Show; //da um show no form

Se testarmos nossa aplicação, veremos que já esta funcionando corretamente. Não vou explicar passo a função, pois a mesma já está bem auto explicativa.

Para fecharmos o nosso form e o liberarmos da memória, adicione um Botão ao Frame FrmCliente e coloque o seguinte código:

procedure TFrmCliente.BtnFecharClick(Sender: TObject);
var
  Temp: TForm;
begin
  {-> Armazena TForm criado dinâmicamente }
  {-> Libera Tela (TFrame) }
  {-> Libera Form armazenado. }

  Temp := TForm(FrmCliente.Parent);
  FrmCliente.Free;
  Temp.Free;
end;

Conclusão

Nesse exemplo falamos um pouco sobre aplicações MDI, como trabalhar com Frame e como criar um form dinamicamente.

Bom amigos, por essa semana e só! Estarei dando continuidade aos meus artigos sempre falando sobre novas tecnologias, mas com artigos simples e de fácil entendimento, voltado para usuários iniciantes.

Espero que todos tenham gostado e ate a próxima.

Obs.: Estou esperando dicas para os próximos artigos! Sua participação é muito importante.

Sérgio de C. Guedes
Contato: sergio_rj45@yahoo.com.br
www.sistemasmais.net



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


por: r.freddo (r.freddo@gmail.com) : Mar 08, 2008 - 11:08
(Informações sobre o membro | Enviar uma mensagem) http://
Sergio,

Qual a diferença entre criar um Frame para cadastro do cliente por exemplo, e criar um Form do tipo MDIChild ?

Obrigado.


por: jonatapaulino (jonatapaulino@gmail.com) : Jan 26, 2009 - 11:14
(Informações sobre o membro | Enviar uma mensagem)
Não consegui rodar o programa..... ele pede a declaraçao da variável JANELA..


por: jonatapaulino (jonatapaulino@gmail.com) : Jan 26, 2009 - 11:37
(Informações sobre o membro | Enviar uma mensagem)
quando eu fui rodar o programa deu os seguintes erros:
[Error] UfrmPrincipal.pas(63): Undeclared identifier: 'Janela'
[Fatal Error] PrPrincipal.dpr(6): Could not compile used unit 'UfrmPrincipal.pas'


por: adilsonbad (adilsonbad@gmail.com) : Fev 05, 2009 - 02:47
(Informações sobre o membro | Enviar uma mensagem)
Olá, o meu rodou blz, só que ta rolando o seguinte problema, quando eu fecho o frame no botão a primeira vez funciona certinho mais se eu abrir e tentar fehcar o frame rola o seguinte problema.

Projet prjMDI.exe raised exception class EAccessVilation with message 'Access violation at address 004032B8 in module 'prjMDI.exe'. Read of address 0014F0000'. Process stopped. Use Step or Run to continue.

gostaria de uma ajuda nisso...


por: Eu² (juan.pereira@uol.com.br) : Fev 14, 2009 - 11:31
(Informações sobre o membro | Enviar uma mensagem)
Segui os passos deste artigo, e funcionou +- do jeito que eu queria.
O único problema, é que o frame é sempre carregado nas mesmas dimensões, independente dos valores usados para chamar a função.
Posso usar valores de '0' até '9999' que o frame sempre carrega do mesmo tamanho.
Tem como resolver isso?
Imagem do frame: http://i164.photobucket.com/albums/u17/quilava-shiny/frame.png
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

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