Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Como Fechar Todos os Formulários Criados em Tempo de Exe


jessegestin

Pergunta

Boa Tarde!!
No meu projeto, alguns forms são criados normalmente junto com a inicialização. da aplicação. O padrão do Delphi.
Só que, o resto dos forms ( a grande maioria), são criados em tempo de execução por um click de um botão de um RIBBON.
if Form34NotafiscalEntrada = nil then
begin
//Form34NotafiscalEntrada := TForm34NotafiscalEntrada.Create(Self);
Application.CreateForm(TForm34NotafiscalEntrada,Form34NotafiscalEntrada);
SetWindowLong(Form34NotafiscalEntrada.Handle, GWL_ExStyle, GetWindowLong(Form34NotafiscalEntrada.Handle, GWL_ExStyle)or
WS_EX_AppWindow);
//Form34NotafiscalEntrada.show;
SetWindowPos(Form34NotafiscalEntrada.Handle, HWND_TOP, 0, 0, 0, 0,
SWP_NOACTIVATE or
SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);
Form34NotafiscalEntrada.WindowState:=wsMaximized;
Form34NotafiscalEntrada.Show;
end;
end;
No evento do OnClose de cada formulário criado em tempo de execução:
Form34NotafiscalEntrada.Release;
Form34NotafiscalEntrada.Free;
Form34NotafiscalEntrada := nil;
A questão é que, em um botão login, gostaria de fechar todos os formulários abertos, criados na inicialização do Projeto, ou em tempo de execução pelo click do atalho do Ribbon....
Estou usando o seguinte código para fechar:
for n:=0 to Application.ComponentCount-1 do
if Application.Components[n] is TForm then
if not(TForm(Application.Components[n]) = Application.MainForm) then
if TForm(Application.Components[n]).Showing then TForm(Application.Components[n]).Close;
Seguindo estes passos, estou com problemas, pois, ele não fecha todos os forms criados e tempo de execução, e ainda ocorre uns erros e tals. ( E pelo que observei os que são criados na inicialização da aplicação fecha normalmente)>
//Meu form Principal é o de Login.
Desde já muito obrigado.
Abraços !!!
Editado por jessegestin
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0
Estou usando o seguinte código para fechar:
for n:=0 to Application.ComponentCount-1 do
if Application.Components[n] is TForm then
if not(TForm(Application.Components[n]) = Application.MainForm) then
if TForm(Application.Components[n]).Showing then TForm(Application.Components[n]).Close;
o que acontece se no meio desse loop ele encontra o form principal ? ele vai tentar fecha-lo tambem ...por isso ocorre os seus erros
feche o form com o comando close
Form34NotafiscalEntrada.Close;
abraço
Link para o comentário
Compartilhar em outros sites

  • 0

"o que acontece se no meio desse loop ele encontra o form principal ? ele vai tentar fecha-lo tambem ...por isso ocorre os seus erros

feche o form com o comando close
Form34NotafiscalEntrada.Close;
abraço"

Bom Dia!
Esta linha verifica se é o principal, pra dar continuidade no código ou não:
if not(TForm(Application.Components[n]) = Application.MainForm) then
Se for, ele não passa pela linha que fecha o form.
Abraços
Link para o comentário
Compartilhar em outros sites

  • 0

ok... vamos tentar fazer da maneira correta

crie o form de login e menu de maneira automatica

os demais podem ser criados em tempo de execução

exemplo

procedure TFMenu.Funcionrios1Click(Sender: TObject);
begin
try
if FCadFunc = Nil then
FCadFunc := TFCadFunc.Create(self);
except
ShowMessage('Erro na criação do formulário !!');
exit;
end;

FCadFunc.showmodal;
//FreeAndNil(FCadFunc);
end;

veja que se voce liberar a linha do comando FreeAndNil o form será tirado da memoria assim que o mesmo for fechado

entretanto, ao deixar esse comando como comentario, o form sera fechado mas não retirado da memoria

o fato de voce desejar fechar quase todos os forms do seu programa, deve-se levar em conta se realmente é necessario essa abordagem ( somente se o consumo de memoria for critico )

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

ok... vamos tentar fazer da maneira correta

crie o form de login e menu de maneira automatica

os demais podem ser criados em tempo de execução

exemplo

procedure TFMenu.Funcionrios1Click(Sender: TObject);

begin

try

if FCadFunc = Nil then

FCadFunc := TFCadFunc.Create(self);

except

ShowMessage('Erro na criação do formulário !!');

exit;

end;

FCadFunc.showmodal;

//FreeAndNil(FCadFunc);

end;

veja que se voce liberar a linha do comando FreeAndNil o form será tirado da memoria assim que o mesmo for fechado

entretanto, ao deixar esse comando como comentario, o form sera fechado mas não retirado da memoria

o fato de voce desejar fechar quase todos os forms do seu programa, deve-se levar em conta se realmente é necessario essa abordagem ( somente se o consumo de memoria for critico )

abraço

Ok jhonas!

Vlw pelas dicas ai!!! Muito bom!!

Solução que no meu caso realmente funcionou:

Chamar os Formulários desta forma:

Application.CreateForm(TForm34NotafiscalEntrada,Form34NotafiscalEntrada);

// não usar a forma do Self

E no OnClose trocar

//Form34NotafiscalEntrada.Free;
Por:

Action := CaFree;

O resto mantive o mesmo, e funcionou!

Obrigado pela ajuda e pela atenção!!!!

Abraços !! [Resolvido]

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...