... ::: Como fazer pra deixar o aplicativo leve :: ...

Delphi

14/02/2003

quero saber o seguinte:

pro meu programa nao ficar cheio de coisa carregada na memoria, quero saber quando uso essas coisas:

Form1.Show e Form1.Showmodal (qual é a diferenca?)

pra que serve e onde uso:
Form1.Free
Form1.close
(qual libera o form da memoria?)

que mais tem pra liberar os trem?


Garciabh2

Garciabh2

Curtidas 0

Respostas

Anonymous

Anonymous

14/02/2003

Olá...
Faça o seguinte, na propriedade do Form, procure no Events OnClose e coloque a linha de comando para todas as janelas.
Action := cafree;

Antes de você dar um showmodal, nas telas, faça:
Update;
Form1 := TForm1.Create(Self)
Form1.showmodal;

O showmodal, impede que vc acesse alguma janela em segundo plano.
No menu Project do Delphi, Options, deixe somente sua forma principal como Auto-Create Forms, as demais, deixe como Avaliable Form.

Isso melhora em 40¬ a velocidade.
Espero ter ajudado
Abraços
Carlão
carlao@sulbrasil.com.br


GOSTEI 0
Nildo

Nildo

14/02/2003

Se voce esta no form1, e coloca um form2.showmodal, ele para completamente a execucao do form1, mostra o form2 e o form1 soh volta a funcionar quando o form2 for fechado.

O form1.close apenas fecha o form
o form2.free libera ele da memorio. Quando o free é chamado, voce tem que dar outro .create para mostrar denovo


GOSTEI 0
Garciabh2

Garciabh2

14/02/2003

Carlao,

testei o Action := cafree;
no OnClose do Form2, mas deu uns pau feio

a ideia de colocar os forms como available pareceu ótima! até abriu mais rapido o programa, mas quando fui abrir um form2 pelo menu deu uns access violation feioso aqui... ao inves de Form2.showmodal tenho que usar Form2.create?

será que faltou algo?

A ideia do Bart Ninja tb foi boa! só uma duvida: compensa dar um Free no form pra depois ter que dar um Create de novo?


GOSTEI 0
Anonymous

Anonymous

14/02/2003

Se vc. estiver fazendo referência a ele em outro formulário vai ter que ´zerar´essa referência. E testar ao criar tb.
Exemplo:
no Close do form, depois do caFree:
TFormASerFechado.close()
begin
Action:=caFree;
Frm_Principal.FormASerFechado:=nil;
end;


TFrm_Principal.CriarFormASerFechado_ActExecute;
begin
if not assigned(FormASerFechado) then
FormASerFechado:=tFormASerFechado.Create(self);
FormASerFechado.Show;
end;

E por aí vai...
sohad@ig.com.br


GOSTEI 0
Anonymous

Anonymous

14/02/2003

O detalhe é o seguinte.
Quando vc usar o Action := cafree;
será sempre necessário que vc crie a forma novamente, no menu que vc está fazendo,

Form1 := TForm1.Create(Self);

Esse comando Action, ele libera de vez a tela e todos os recursos usados por ela da memória.

Qualquer coisa, me mande um mail.

carlao@sulbrasil.com.br


GOSTEI 0
Nildo

Nildo

14/02/2003

Sim. voce tera que dar um create toda vez que mostrar o form.


GOSTEI 0
Fred

Fred

14/02/2003

Será que ninguem sabe nada...

Faça o Seguinte na hora de chamar o form digite

if formaserchamado = nil then //se nao estiver criado entao crie
formaserchamado := tformaserchamado.create(self);
formaserchamado.show; ou showmodal

No evento onclose deste formaserchamado digite:

action := cafree;
formaserchamado := nil;

Só isso!!! 8)


GOSTEI 0
Nebrio

Nebrio

14/02/2003

kra faça assim:

Para criar o form faça:

Form := TForm.Create(self);
Form.ShowMoal;

No Evento OnClose do Form faça:

Action := CaFree;
Form := Nil;

No Evento OnDestroy faça:

Form := Nil;

Form = ao nome do seu Form

Nébrio

Avise se funcionar


GOSTEI 0
Garciabh2

Garciabh2

14/02/2003

Nebrio, Nildo, Carlao e Sohad, brigadao pela resposta!!

fui tentando aqui e funcionou o que o Fred disse
fiz do jeitim que ele falou e nao deu pau (tava acontecendo de ele abrir o form uma vez, mas quando fechava e pedia pra abrir de novo dava pau)

aí peguei mais o que o Carlao sugeriu de colocar os forms secundarios todos em Available (ao inves de AutoCreate) nas opcoes do projeto e a abertura tambem ficou muito mais rapida.

acho que deu pra gente dar uma esclarecida de como fazer ficar mais leve (inclusive os que acessaram querendo saber mais sobre isso)


GOSTEI 0
Sandra

Sandra

14/02/2003

Gente, eu conheço de outro jeito, parecido com a dica do Fred. É assim, por exemplo, do form principal e acessar o form sobre (F_Sobre), através de um click em um botão ou item de menu :

If Application.FindComponent(´F_Sobre´) = Nil Then
Application.CreateForm(TF_Sobre, F_Sobre) ;
Try
F_Sobre.ShowModal ;
Finally
F_Sobre.Free ;
End ;


Só isso...


GOSTEI 0
Espiridiao

Espiridiao

14/02/2003

Gostei muito da vossa explicação, já agora como fazer para liberar a memoria de uma table/dataset...

Obrigado :wink:


GOSTEI 0
Garciabh2

Garciabh2

14/02/2003

além disso tudo, pegar o ASPack
http://www.aspack.com
foi ótimo pra enxugar o exe
(reduziu o meu de 1.5Mb pra 500Kb !!!
fica menor na memoria


GOSTEI 0
POSTAR