Fórum Close não fecha o form.... #272585
16/03/2005
0
estou com o seguinte problema: tenho um aplicativo que ao ser iniciado cria 3 forms de pesquisa afim de mantê-los na memória e consequentemente não perder os filtros realizados pelos usuários na última pesquisa. O funcionamento é simples, apenas chamo a função ShowModal do form qdo o usuário clica em BUSCAR. No fim da pesquisa eu chamo a função Close para fechar o form, pois assim o form fechar e o filtro realizado é mantido em memória. Acontece que algumas vezes o form não fecha! Não adianta clicar no (X), no botão q dispara o close do form.... ele não fecha! Pra piorar, ele deixa de ser modal, ou seja, eu consigo ir na janela principal do form e realizar outras operações. Se eu clicar em BUSCAR, o form de pesquisa (q já está aberto) recebe o foco, mas não deixa editar, não deixa clicar nos botões.... consequentemente travando o aplicativo.
Resumindo: o problema é na função Close do formulário que não funciona direito.
Detalhes importantes:
_ este erro geralmente ocorre quando o Windows (no meu caso XP) está com muitos aplicativos abertos.
_ só ocorre no executável. Rodando de dentro do Delphi 7 funciona perfeitamente
Grato desde já pela ajuda.
Fabricio Lb
Curtir tópico
+ 0Post mais votado
16/03/2005
Wart
Gostei + 1
Mais Posts
16/03/2005
Cabelo
Há duas maneiras de resolver seu problema..
1 - dê um Action := caFree no evento onclose do form, e trabalhe normalmente..
2 - Tire do Options Project no editor de forms, os três forms e coloque esta rotina no evento create do projeto.
application.createform(Tform, Form);
Form.ShowModal;
Form.Release;
Perceba que na segunda opção vc tem um ganho maior de processamento, pois vc libera memória sempre que não estiver usando o form.
Nas duas opções, vc deve criar um vetor e armazenar os dados ´de memória´ como vc diz, pq sempre q você fechar o form, seja em qualquer das opções, ele será liberado da memória..
espero ter ajudado.
Gostei + 0
16/03/2005
Rodc
Não sei mais o que fazer também...
Caso consiguam resolver postem aqui a solução.
Grato,
Rodrigo Cesar dos Santos
Gostei + 0
08/04/2006
Erivando
Também estou com este problema, já resolveu? Como?
ramos
Gostei + 0
08/04/2006
Marco Salles
não é o procedimento indicado.. As biografias e portanto devemos segui-las indicam que para criação de Formulários ShowModal devemos usar NIL
como OWNER .. isto diz ao delphi que é voce o Responsável pela destruição do objeto
try Form1:=TForm1.Create(nil); Form1.Showmodal; finally Form1.Release;
2)Quando se detroi um formulário Clicando NO ´X´ ou pressionando
Alt+F4/CNTR+F4 o formulário não é liberado da memória
Porque não o é liberado :?: :?: :?:
Resposta: No caso do formulári ser SDI a aplicação o esconde
no caso do formulario ser MDI a aplicação o Minimiza
Para alterar este comportamento devemos no seu evento Onclose digitar
[b:9986c66e4f]Action:=Cafree;[/b:9986c66e4f] , dai a importância para evitar surpresas desagradáveis
3)é recomendável no caso de formularios destrui-los usando o método Release , ao inves do FreeandNil()
Sem mais eu acho que o problema do Fabricio LB e aonde e como ele esta criando esses formulários e como e quando os estas destruindo. Parta evitar delongas ele poderia ser mais explicativo nesse processo.Para mim não ficou claro :cry: :cry: :cry:
Gostei + 0
08/04/2006
Erivando
não é o procedimento indicado.. As biografias e portanto devemos segui-las indicam que para criação de Formulários ShowModal devemos usar NIL
como OWNER .. isto diz ao delphi que é voce o Responsável pela destruição do objeto
try Form1:=TForm1.Create(nil); Form1.Showmodal; finally Form1.Release;
2)Quando se detroi um formulário Clicando NO ´X´ ou pressionando
Alt+F4/CNTR+F4 o formulário não é liberado da memória
Porque não o é liberado :?: :?: :?:
Resposta: No caso do formulári ser SDI a aplicação o esconde
no caso do formulario ser MDI a aplicação o Minimiza
Para alterar este comportamento devemos no seu evento Onclose digitar
[b:60a59d5106]Action:=Cafree;[/b:60a59d5106] , dai a importância para evitar surpresas desagradáveis
3)é recomendável no caso de formularios destrui-los usando o método Release , ao inves do FreeandNil()
Sem mais eu acho que o problema do Fabricio LB e aonde e como ele esta criando esses formulários e como e quando os estas destruindo. Parta evitar delongas ele poderia ser mais explicativo nesse processo.Para mim não ficou claro :cry: :cry: :cry:[/quote:60a59d5106]
Fiz como sugeriu acima mas continua o problema, para que vc possa entender irei expolicar novamente
estou com um problema muito estranho...
Eu uso preview que eu personalizei, usei o QRPreview, funciona perfeitinho, más quando mando imprimir ele faz a impressão dou um close no formulário onde está o QRPreview até aí funciona ele sai más o formulário anterior num dá close de foma nenhuma..
Mas isso comerçou acontecer quando passei a usar o meu sistema no winXP pro em rede, ok! no windows 98 mesmo em rede era tudo bacana.
No button coloco este código
Código:
QuickRep1.Preview;
para impimir do qreport coloco :
Código:
Try
Application.CreateForm(TFrmRelAniv, FrmRelAniv);
FrmRelAniv.QuickRep1.OnPreview := FrmPrincipal.CustomPreview;
FrmRelAniv.QuickRep1.Preview;
finally
FrmRelAniv.Free;
end;
alguém pode me dá uma luz ? vlw
Gostei + 0
08/04/2006
Marco Salles
a intenção não foi especificamente de resolver o problema , mas sim apresentar conceitos ..
Esta situações são genericas , depende de muita coisa.
eu não entendo o que é e porque se faz necessário esta instrução
se so geralmete FrmRelAniv.QuickRep1.Preview;
Tb não concordo com este modo de criar o FrmRelAniv com disse anteriormente
eu faria assim:
try FrmRelAniv:=TFrmRelAniv.create(nil); FrmRelAniv.QuickRep1.PreviewModal; finally FrmRelAniv.release; end;
[b:f9b0afea48]e aonde e como voce esta criando O QrPreview ????[/b:f9b0afea48]
Seria por acaso no evento On.QuickRep1Preview :?: :?:
enfim , criando e destruindo corretamente é o primeiro passo , e não a solução definitiva
Gostei + 0
08/04/2006
Erivando
a intenção não foi especificamente de resolver o problema , mas sim apresentar conceitos ..
Esta situações são genericas , depende de muita coisa.
eu não entendo o que é e porque se faz necessário esta instrução
se so geralmete FrmRelAniv.QuickRep1.Preview;
Tb não concordo com este modo de criar o FrmRelAniv com disse anteriormente
eu faria assim:
try FrmRelAniv:=TFrmRelAniv.create(nil); FrmRelAniv.QuickRep1.PreviewModal; finally FrmRelAniv.release; end;
[b:4957e1ba58]e aonde e como voce esta criando O QrPreview ????[/b:4957e1ba58]
Seria por acaso no evento On.QuickRep1Preview :?: :?:
enfim , criando e destruindo corretamente é o primeiro passo , e não a solução definitiva[/quote:4957e1ba58]
Gostei + 0
10/04/2006
Rodc
Não trabalho mais com o sistema que tinha este problema, mas possivelmente ainda persiste.
Mas nesta nova empresa que trabalho percebi uma coisa, o form não termina enquanto não terminar todas as rotinas de processamento. Exemplo básico é você colocar um Application.ProcessMessages() dentro de um for infinito e clicar em fechar, ele só vai fechar quando o for terminar.
Possivelmente deve ter algum código, ou mesmo componente, que deve estar rodando uma Thread, por isso o form não é encerrado.
INFORAMOS, seu form só trava se você chamar o QuickReport ou mesmo sem chamá-lo?
Mas de uma coisa eu tenho certeza, o Windows XP e 2003 são meio bagunçados no controle das janelas.
Gostei + 0
10/04/2006
Marco Salles
[b:ef3c07e854]Quem disse que seria resolvido[/b:ef3c07e854] :?: :?: :?:
1citação de [b:ef3c07e854]marco salles[/b:ef3c07e854]
2)citação de [b:ef3c07e854]marco salles[/b:ef3c07e854]
Gostei + 0
10/04/2006
Rodc
Mas mesmo assim desculpa aí...
Gostei + 0
10/04/2006
Marco Salles
mas criação e destruição é o primeiro passo..
tem um excelente artigo na edição 72 da revista que trata desse assunto.
Muito simples porem muito efeciente. Vale a pena conferir.
Gostei + 0
25/04/2006
M@gnun
Meu problema era identico, resolvi trocando o try finally na criação do formulario do preview personalizado por:
no botao que chama o preview coloquei as linhas de criação e no botao que fecha o formulario preview coloquei o release.
Não sei explicar por que funcionou, porem funcionou, e agora estou tentando aprender um pouco mais sobre criar objetos em run time pra nao ficar essa ´micragem´.
Gostei + 0
24/03/2008
Wanderok
Até parece eu dizendo pra mim mesmo !!!! kkk :D:D:D
Pra destacar as coincidências e focar o assunto:
Fabricio LB diz:
´...chamo a função ShowModal do form....
No fim da pesquisa eu chamo a função Close para fechar o form.
Acontece que algumas vezes o form não fecha!
Não adianta clicar no (X), no botão q dispara o close do form.... ele não fecha!
Pra piorar, ele deixa de ser modal, ou seja, eu consigo ir na janela principal do form e realizar outras operações.
.... consequentemente travando o aplicativo.
Resumindo: o problema é na função Close do formulário que não funciona direito. ...´
rodc - Rodrigo Cesar dos Santos, diz:
´...o Window parece que se perde no controle das janelas, ocorrendo este travamento.
Sem falar que muitas vezes o form não fica modal e cai para trás dos outros formulários.
Caso consiguam resolver postem aqui a solução....´
INFORAMOS, diz:
´
Eu uso preview que eu personalizei, usei o QRPreview, funciona perfeitinho,
más quando mando imprimir ele faz a impressão dou um close no formulário onde está o QRPreview
até aí funciona ele sai más o formulário anterior num dá close de foma nenhuma... ´
rodc, diz:
´Primeiramente, não tem nada a ver com criação e destruição do form,
porque para ser destruido ele tem que fechar, e o problema é justamente ele fechar.
Mas nesta nova empresa que trabalho percebi uma coisa,
o form não termina enquanto não terminar todas as rotinas de processamento.
Exemplo básico é você colocar um Application.ProcessMessages() dentro de um for infinito e clicar em fechar,
ele só vai fechar quando o for terminar.
Possivelmente deve ter algum código, ou mesmo componente,
que deve estar rodando uma Thread, por isso o form não é encerrado. ´
PS: ISTO REALMENTE PERCEBI. LEVA UM TEMPO PRA QUERY RECUPERAR TODOS OS REGISTROS FILTRADOS
NO FORM FECHADOR E EXIBIR NO QUICK REPORTER. ENTAO PERCEBI Q SOMENTE APOS UM TEMPINHO (EXATAMENTE O DE
PREENCHIMENTO DO RELATORIO) É QUE O FORM PERMITIA SER FECHADO. ISTO QUANDO JÁ HAVIA EVOLUIDO UM POUCO
POR AQUI ...)
Marco Salles diz
´mas criação e destruição é o primeiro passo.. ´
resolvi incluindo a instrução FREE no evento onClose do meu preview.
====================================================================
é tiro-e-queda. !!! :D:D:D
[b:3619246932]procedure TfrmPreview.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Free;
end;[/b:3619246932]
Pronto. Ficou tudo joinha....
Gostei + 0
24/03/2008
Wanderok
http://forum.devmedia.com.br/viewtopic.php?t=58178
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)