GARANTIR DESCONTO

Fórum Close não fecha o form.... #272585

16/03/2005

0

Prezados amigos,

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

Fabricio Lb

Responder

Post mais votado

16/03/2005

você já tentou colocar um Action := caFree; no método Close do form que você quer fechar?


Wart

Wart
Responder

Gostei + 1

Mais Posts

16/03/2005

Cabelo

Colega..

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.


Responder

Gostei + 0

16/03/2005

Rodc

Nossa cara, eu também estou tendo este problema já faz algum tempo, e é uma dor de cabeça. Eu uso Win 2003. Meu sistema cria e libera cada form dinamicamente. Mas eu uso uma tecnologia que todos os usuários logan na mesma máquina para rodar o executável, e sempre que tem muitas pessoas conectadas, o processamento fica um pouco lento e 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.
Não sei mais o que fazer também...
Caso consiguam resolver postem aqui a solução.
Grato,

Rodrigo Cesar dos Santos


Responder

Gostei + 0

08/04/2006

Erivando

Nossa cara, eu também estou tendo este problema já faz algum tempo, e é uma dor de cabeça. Eu uso Win 2003. Meu sistema cria e libera cada form dinamicamente. Mas eu uso uma tecnologia que todos os usuários logan na mesma máquina para rodar o executável, e sempre que tem muitas pessoas conectadas, o processamento fica um pouco lento e 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. Não sei mais o que fazer também... Caso consiguam resolver postem aqui a solução. Grato, Rodrigo Cesar dos Santos


Também estou com este problema, já resolveu? Como?

ramos


Responder

Gostei + 0

08/04/2006

Marco Salles

se me permite , so tres deixas , não é nen para resolver o problema inicial do Fabricio LB < dei uma lida , mas não entendi muita coisa > , mas é de interresse comunitário

application.createform(Tform, Form); Form.ShowModal; Form.Release;


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:


Responder

Gostei + 0

08/04/2006

Erivando

[quote:60a59d5106=´Marco Salles´]se me permite , so tres deixas , não é nen para resolver o problema inicial do Fabricio LB < dei uma lida , mas não entendi muita coisa > , mas é de interresse comunitário

application.createform(Tform, Form); Form.ShowModal; Form.Release;


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


Responder

Gostei + 0

08/04/2006

Marco Salles

Fiz como sugeriu acima mas continua o problema, para que vc possa entender irei expolicar novamente


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

FrmRelAniv.QuickRep1.OnPreview := FrmPrincipal.CustomPreview;


se so geralmete FrmRelAniv.QuickRep1.Preview;

Tb não concordo com este modo de criar o FrmRelAniv com disse anteriormente

Application.CreateForm(TFrmRelAniv, FrmRelAniv); FrmRelAniv.QuickRep1.OnPreview := FrmPrincipal.CustomPreview; FrmRelAniv.QuickRep1.Preview; finally FrmRelAniv.Free;


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


Responder

Gostei + 0

08/04/2006

Erivando

[quote:4957e1ba58=´Marco Salles´]
Fiz como sugeriu acima mas continua o problema, para que vc possa entender irei expolicar novamente


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

FrmRelAniv.QuickRep1.OnPreview := FrmPrincipal.CustomPreview;


se so geralmete FrmRelAniv.QuickRep1.Preview;

Tb não concordo com este modo de criar o FrmRelAniv com disse anteriormente

Application.CreateForm(TFrmRelAniv, FrmRelAniv); FrmRelAniv.QuickRep1.OnPreview := FrmPrincipal.CustomPreview; FrmRelAniv.QuickRep1.Preview; finally FrmRelAniv.Free;


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]

É, eu ja tinha feito assim como vc sugeriu: Try FrmRelAniv:=TFrmRelAniv.Create(nil); //FrmRelAniv.QuickRep1.OnPreview := FrmPrincipal.CustomPreview; FrmRelAniv.QuickRep1.PreviewModal; finally FrmRelAniv.Release; end; deixando o Preview personalizado de fora, [b:4957e1ba58]e o meu problema de fechar o form onde fica o botão imprimir foi resolvido :) mas...[/b:4957e1ba58]mas o Preview padrão do QuickReport é acionado e aí eu não queria os textos lá que estão em inglês! Se tiver uma forma de traduzir o q tem lá para mim tar de bom tamanho! ????



Responder

Gostei + 0

10/04/2006

Rodc

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.
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.


Responder

Gostei + 0

10/04/2006

Marco Salles

Primeiramente,[b:ef3c07e854] não tem nada a ver [/b:ef3c07e854]com criação e destruição do form, porque para ser destruido ele tem que fechar, e o problema é justamente ele fechar.



[b:ef3c07e854]Quem disse que seria resolvido[/b:ef3c07e854] :?: :?: :?:

1citação de [b:ef3c07e854]marco salles[/b:ef3c07e854]
se me permite , so tres deixas ,[b:ef3c07e854] não é nen para resolver [/b:ef3c07e854]o problema inicial do Fabricio LB...

2)citação de [b:ef3c07e854]marco salles[/b:ef3c07e854]
a intenção[b:ef3c07e854] não foi especificamente de resolver o problema[/b:ef3c07e854] , mas sim apresentar conceitos ..



Responder

Gostei + 0

10/04/2006

Rodc

Woou!! Calma aí amigo, não precisa ficar nervoso, só quiz dizer que pela experiência que tenho não é problema de criação e destruição do form. Apenas tive o intúito de descartar possibilidades.
Mas mesmo assim desculpa aí...


Responder

Gostei + 0

10/04/2006

Marco Salles

sempre to calmo..

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.


Responder

Gostei + 0

25/04/2006

M@gnun

meio que desenterrando mas aí vai...

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´.


Responder

Gostei + 0

24/03/2008

Wanderok

Passei por tudo isto EXATAMENTE como descrito por voces.

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....


Responder

Gostei + 0

24/03/2008

Wanderok

Esta experiência ocorreu comigo neste final-de-semana enquanto criava o preview personalizado do quickreport para minha aplicação.

http://forum.devmedia.com.br/viewtopic.php?t=58178


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar