Fórum Meu prog esta louco - Está dando a msg Memória insuficiente #187019

07/10/2003

0

Meu programa tem o seguinte código:

frmPresTre := TfrmPresTre.Create(Self);
frmPresTre.qrSimples.Preview;
frmPresTre.qrSimples.Free;
frmPresTre := Nil;

Funciona da seguinte maneira em uma tela o usuário escolhe o aluno que quer imprimi o qrSimples, depois que escolher ele executa esses comandos acima, qdo termina a última linha dos códigos acima ele chama a tela de escolher o aluno novamente e fica nesse loop até o usuário teclar esc na tela.

Até aí tudo bem. O problema é qdo o usr imprime vários relatórios (o programa fica várias vezes neste loop chamando o qrSimples) o programa trava dando a mensagem memória insuficiente.

:cry: :cry: não entendo pq está dando memória insuficiente se estou dando o comando Free :cry: :cry: :cry: :cry:

:cry: Alguém pode me ajudar? :cry:

Obrigada
Debora


Debora

Debora

Responder

Posts

07/10/2003

Vinicius2k

Debora,

acredito que a melhor forma de liberar um form da memória é com o método Release (form1.Release)... tente mudar seus ´Free´ para ´Release´ talvez resolva o problema...

espero ter ajudado...


Responder

Gostei + 0

07/10/2003

Macario

Meu programa tem o seguinte código: frmPresTre := TfrmPresTre.Create(Self); frmPresTre.qrSimples.Preview; frmPresTre.qrSimples.Free; frmPresTre := Nil;



Veja bem ao chamar o novo form tente usar

frmPresTre := TfrmPresTre.Create(Self); try frmPresTre.qrSimples.Preview; finally frmPresTre.Free;



e de qualquer maneira vc tem que chamar o metodo close dos forms que vc instancia na memoria

espero que ajude


Responder

Gostei + 0

07/10/2003

Beppe

vc está criando um form mas está liberando um componente contido nele.

Ataliba.


Responder

Gostei + 0

07/10/2003

Debora

vc está criando um form mas está liberando um componente contido nele. Ataliba.


O que faço então?


Responder

Gostei + 0

07/10/2003

Beppe

Como o Macario já respondeu. Se ainda der memória insuficiente, seu problema então é levemente mais profundo.

Ou tente isso:

No OnClose do TfrmPresTre:

Action := caFree;


No OnShow do TfrmPresTre:

qrSimples.Preview;


Para criá-lo:

TfrmPresTre.Create(Application).ShowModal;

Ataliba.


Responder

Gostei + 0

08/10/2003

Marcioih

Debora, só para complementar uma parte!

Se você usar o método Release ao invés de Free como o Vinicius2k disse, você só tira o Formulário da memória, os componentes contidos nele permanecem na memória.

Faça como o Macario falou, não coloque Free no quickreport mas sim no formulário!

frmPresTre := TfrmPresTre.Create(Self);
try
frmPresTre.qrSimples.Preview;
finally
frmPresTre.Free;

Até mais!


Responder

Gostei + 0

08/10/2003

Beppe

Se você usar o método Release ao invés de Free como o Vinicius2k disse, você só tira o Formulário da memória, os componentes contidos nele permanecem na memória.


Será que ninguém sabe como utilizar Release? Bem, eu nunca vi! :cry:

O Release deve ser usado no caso de você querer liberar o form(e todos os seus subcomponentes) ativo. Ele posta uma mensagem que só executa quando todos os manipuladores de evento deste form tiverem terminada, garantindo assim que nenhum método execute usando dados já liberados(o Free libera instanteneamente).

PS: Quando chamar Release no form principal, chame Application.Terminate em seguida.

Espero que isto clarifique.

Ataliba.


Responder

Gostei + 0

08/10/2003

Adilsond

Tente o seguinte:

frmPresTre := TfrmPresTre.Create(Self);
try
frmPresTre.qrSimples.Preview;
frmPresTre.qrSimples.Free;
frmPresTre.qrSimples.QrPrinter := nil;
finally
FreeAndNil(frmPresTre);
end;

Mas acho que o correto neste seu caso seria voce criar apenas uma vez o seu formulario no início do form que o chamará, executar apenas o preview várias vezes e ao final do form chamador destruir o formulário que contém o relatório.


Responder

Gostei + 0

08/10/2003

Vinicius2k

Se você usar o método Release ao invés de Free como o Vinicius2k disse, você só tira o Formulário da memória, os componentes contidos nele permanecem na memória.


algumas palavras sobre Release :

Erro de violação de acesso é ocasionado por ´tentar´ efetuar acesso a um objeto que já foi destruído. Muitas vezes ocorre ao tentar liberar um formulário da memória onde nem todos os processos foram finalizados. Portanto, sempre utilize o método Release ao invés de free ou destroy para liberar seus formulários. Acompanhando o raciocínio do colega mmtoor, coloque um fragmento do código pra gente poder entender melhor. _________________ Atenciosamente, []´s Aroldo Zanela (Moderador)



Responder

Gostei + 0

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

Aceitar