Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

André Maretti

Formulários MDI e MDIChild

Recommended Posts

Oi galera... bom dia,

 

vejamos se alguém pode me ajudar.

 

Estou desenvolvendo um sistema onde tenho um formulário Principal (Form_Principal) e a partir deles, entre muitos outros formulários, abro dois em especial (os que estão me dando problema): Form_Cad_Alunos e o Form_Turmas.

 

No form principal cloquei a propriedade FormStyle como fsMDIForm, o nos formulários Form_Cad_Alunos e Form_Turmas coloquei fsMDIChild.

 

No menu Project/Option do delphi, na opção Forms, deixo como autocreate somente o Form_Principal e meu datamodule.

 

para abrir os formulários Form_Cad_Alunos e form_Turmas faço assim:

Application.CreateForm(TForm_Cad_Alunos, Form_Cad_Alunos);
Form_Cad_Alunos.Show;

Application.CreateForm(TForm_Turmas, Form_Turmas);
Form_Turmas.Show;

Bom.... até aqui está funcionando beleza. Fiz assim depois de pesquisar em um tutorial de como trabalhar com Formulários MDI e MDIChild. Espero que esteja correto essa forma de trabalhar, mas se não tiver, por favor me avisem.. rs

 

O MEU PROBLEMA:

Quando estou com o formulário Form_Turmas (que é Child) aberto e a partir dele preciso abrir o formulário Form_Cad_Alunos (q tb é child), eu não consigo.

Usando este comando o sistema simplesmente trava, e só consigo sair dele finalizando pelo gerenciador de tarefas.

Application.CreateForm(TForm_Cad_Alunos, Form_Cad_Alunos);
Form_Cad_Alunos.Show;

 

Alguém sabe como eu faço para abrir um formulário fsMDIChild a partir de outro formulário fsMDIChild?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite André Marreti

 

Sinceramente o sistema era para abrir o form, não sei porque está travando. Já que voce o está abrindo com o método CreateForm do Objeto Application, mesmo que ele já estivesse instanciado na memória, e voce clicasse para abrir ele novamente, ele criaria outra instancia do mesmo Form.

 

Entretanto, sobre sistemas MDI, é preciso observar certos quisitos como: http://forum.imasters.com.br/public/style_emoticons/default/ermm.gif

 

1º) O evento OnClose de cada Form MDIChild, está configurado para autodestruir o Form da memória com esse código abaixo?

 

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
   
  // ou

  FreeAndNil(Form3);
end;

Isto porque quando voce instancia o Form pela primeira vez, se voce não o destruir da memória, ele fica lá, e em sistemas MDI ele fica minimizado quando voce tenta fechá-lo, e ainda assim quando voce o tenta instanciá-lo de novo, ele cria uma outra instancia do mesmo Form.

 

2º) Em sistemas MDI, todos Forms MDIChild tem a sua propriedade Visible setada para True e não mudam, isto significa que quando voce o cria com o método CreateForm, ele é automaticamente visualizado, não necessitando de utilizar o seu método Show e muito menos o ShowModal (ShowModal não funciona em sistemas MDI), o método Show apenas seta o foco no Form caso ele esteja instanciado na memória.

 

3º) Para evitar de instanciar o mesmo Form várias vezes, eu criei uma procedure que verifica se ele já está na memória e seta o foco nele caso esteje, se não, cria-o e visualiza-o, voce deve declarar esta procedure no bloco Public da classe do Form MDIForm (Principal), e depois implementá-lo assim:

 

type
  TForm_Principal = class(TForm)
  private
	{ Private declarations }
  public
	{ Public declarations }
	procedure OpenForm(FClass: TFormClass; var Instance);
  end;

var
  Form3: TForm3;

implementation

uses Unit4;

{$R *.dfm}

procedure TForm_Principa.OpenForm(FClass: TFormClass; var Instance);
begin
  if Assigned(TForm(Instance)) then begin
	 TForm(Instance).SetFocus;
	 TForm(Instance).WindowState := wsNormal;
	 TForm(Instance).BringToFront;
  end else
	 Application.CreateForm(FClass, Instance);
end;

Depois é só invocar essa procedure do mesmo jeito que voce invoca Application.CreateForm(....., .....), assim:

 

OpenForm(TForm_Cad_Alunos, Form_Cad_Alunos);

Tente fazer isso de dentro do outro Form MDIChid, basta declararar a unit do Form Principal na seção Uses do MDIChild e invocá-la deste jeito.

 

Form_Principal.OpenForm(TForm_Turmas, Form_Turmas);

Espero que isso resolva.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.