Qual a melhor maneira de trabalhar com os FROMS??

Delphi

24/02/2005

Pessoal... estou com uma dúvida

Não sei qual a melhor maneira de se trabalhar com FORMS.

Não sei se devo criar todos eles no inicio do sistema ou e crio cada um conforme for utilizá-los.

Eu sempre usei assim: no clique do botão colocava:
FRMTeste.create(self);
FRMTeste.showmodal;

Só que desse jeito quando ia fechar o form as vezes dava erro (e depois do erro aparecia ´Runtime error 216´), então passei a criá-los no inicio do sistema e simplesmente dava um
show
para aparecer.

Tem algum outro modo melhor de se trabalhar com eles???


Armando.boza

Armando.boza

Curtidas 0

Respostas

Armando.boza

Armando.boza

24/02/2005

Desculpe pelo Título... é FORMS


GOSTEI 0
Tnaires

Tnaires

24/02/2005

Olá
Eu costumo criar os forms só na hora q for usá-los, e liberá-los da memória quando não precisar mais deles (leia-se: quando o usuário fechar a janela).
Segue o código:
if VariavelQueReferenciaOForm = nil then
  Application.CreateForm(Form, VariavelQueReferenciaOForm);
VariavelQueReferenciaOForm.Show;

E no OnClose do Form:
Action := caFree;
VariavelQueReferenciaOForm := nil

Abraços


GOSTEI 0
Beppe

Beppe

24/02/2005

Eu escrevi um artigo sobre o assunto...o endereço está no rodapé, este que está em negrito.

[url=http://www.beppe.theblog.com.br/inicial.html]Uncanny Dude´s Home[/url] [url=http://www.forumweb.com.br/artigos/artigos.php]Meus artigos:[/url] Aleatorizando [b:b5d430a10c]Otimizando a inicialização do sistema[/b:b5d430a10c]



GOSTEI 0
Zunker

Zunker

24/02/2005

para abrir eu uso assim:

if FORM = nil then FORM := TFORM.Create(self) else begin FORM.WindowState := wsnormal; FORM.show; end;


e para fechar como foi citado pelo ´tnaires´


GOSTEI 0
Fred

Fred

24/02/2005

Depois de muito buscar a melhor maneira de fazer isso, cheguei a esta conclusão e nunca tive problemas!!!


form1 := Tform1.create(self)//ou application
try
form1.showmodal;
finally
form1.Release;
form1 := nil;
end;
8)


GOSTEI 0
Fred

Fred

24/02/2005

soh esqueci de dizer uma coisa: todos os forms devem estar como available forms, no project options!! menos o form menu, e o datamodule se for preciso!!


GOSTEI 0
Tnaires

Tnaires

24/02/2005

Depois de muito buscar a melhor maneira de fazer isso, cheguei a esta conclusão e nunca tive problemas!!! form1 := Tform1.create(self)//ou application try form1.showmodal; finally form1.Release; form1 := nil; end; 8)

Quero só fazer uma consideração: se seu sistema estiver usando forms MDI, e se o form q vc quer criar já tiver sido instanciado, ele vai tentar criar outro em cima da variável q já aponta pro objeto criado anteriormente. Daí a importância do ´if form = nil then´ antes do construtor.


GOSTEI 0
Armando.boza

Armando.boza

24/02/2005

Legal pessoal.... muito obrigado pelas respostas...

No caso deste exemplo de nosso amigo... o que significa o finally e o release???

form1 := Tform1.create(self)//ou application 
try 
form1.showmodal; 
finally 
form1.Release; 
form1 := nil; 
end; 



GOSTEI 0
Tnaires

Tnaires

24/02/2005

O bloco try/finally envolve a execução de instruções q podem resultar em algum erro. As instruções q tiverem dentro do bloco finally serão executadas, independente de ter havido erro nas instruções contidas no bloco try. Nesse caso, o finally garante q o form vai ser liberado da memória (Release), independente d qq condição d término da função ShowModal.


GOSTEI 0
Armando.boza

Armando.boza

24/02/2005

O bloco try/finally envolve a execução de instruções q podem resultar em algum erro. As instruções q tiverem dentro do bloco finally serão executadas, independente de ter havido erro nas instruções contidas no bloco try. Nesse caso, o finally garante q o form vai ser liberado da memória (Release), independente d qq condição d término da função ShowModal.


Legal...

Dessa eu não sabia..

Vou fazer os testes e dou retorno assim que puder

Muito obrigado


GOSTEI 0
Fred

Fred

24/02/2005

Desta mameira nao precisa de if nao senhor!!! porque toda que o formulario eh criado, ele tambem ja eh destruido e liberado da memoria logo apos ser fechado!!! com showmodal eh claro!!!


GOSTEI 0
Paulo_amorim

Paulo_amorim

24/02/2005

Olá

Faço as chamadas com

Form1 := TForm1.Create(self);
try Form1.ShowModal;
finally
Form1.Free;
end;

Como dito, não é necessário if pois ele atribui nil ao liberar o form

Até+


GOSTEI 0
Armando.boza

Armando.boza

24/02/2005

Olá Faço as chamadas com Form1 := TForm1.Create(self); try Form1.ShowModal; finally Form1.Free; end; Como dito, não é necessário if pois ele atribui nil ao liberar o form Até+


Alguem pode me explicar a diferença de usar esse .free e o .release com nil?????


GOSTEI 0
Marcio.theis

Marcio.theis

24/02/2005

De uma olhada nesta dica...

http://www.linhadecodigo.com.br/dicas.asp?id_dica=1042&sub=14


GOSTEI 0
Isabelct

Isabelct

24/02/2005

Form1 := TForm1.Create(self); try Form1.ShowModal; finally Form1.Free; end; Como dito, não é necessário if pois ele atribui nil ao liberar o form


Uma chamada a ´Objeto.Free´ simplesmente não garante a atribuição de nil à variável. Caso queira-se garantir que a variável, após destruída, conterá nil, deve-se fazer a atribuição explícitamente.

Form1 := TForm1.Create(self);
try 
  Form1.ShowModal;
finally
  Form1.Free;
  Form1 := nil;
end;



GOSTEI 0
Tnaires

Tnaires

24/02/2005

Desta mameira nao precisa de if nao senhor!!!

Creio q vc foi infeliz ao não prestar atenção na minha consideração (veja bem: consideração é diferente de correção):
(...) se seu sistema estiver usando forms MDI (...)

Nesse caso, não é possível usar ShowModal, e se vc não usar o ´if form = nil then´, cada vez q vc clicar no botão uma nova instância do mesmo form será criada e exibida, SEM fechar a anterior. O if, nesse caso, serviria para verificar se já existe uma instância do mesmo form criada.
Abraços


GOSTEI 0
Tnaires

Tnaires

24/02/2005

Alguem pode me explicar a diferença de usar esse .free e o .release com nil?????

Extraído da documentação do método Free da classe TObject:
To free a form, call its Release method, which destroys the form and releases the memory allocated for it after all its event handlers and those of the components it contains are through executing.

O método Free é usado para liberar os objetos da memória. A classe TForm implementa o método Release, que segundo a documentação, deve ser usado preferencialmente ao Free. Para reforçar, um trecho da documentação do método Release:
Release does not destroy the form until all event handlers of the form and event handlers of components on the form have finished executing. Release also guarantees that all messages in the form´s event queue are processed before the form is released.

O uso de ambos não elimina a necessidade da atribuição de nil à variável, senão ela apontará para um endereço da memória que não contém nenhum objeto alocado.
Abraços


GOSTEI 0
Armando.boza

Armando.boza

24/02/2005

Muito obrigado pessoal....

Fiz alguns testes a aparentemente os erros desapareceram.

Fico muito grato pela ajuda que me forneceram.

Att

Armando


GOSTEI 0
Armando.boza

Armando.boza

24/02/2005

pessoal.. agora está funcionando perfeitamente..

aqueles erros pararam de aparecer...

muito obrigado a todos

Att

Armando


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

24/02/2005

Colega,

Para formulários e versões mais recentes do Delphi (a partir do Delphi 6), use:

  Application.CreateForm(TForm2, Form2);
  try
    Form2.ShowModal;
  finally
    Form2.Release; // Resolve pendências
    FreeAndNil(Form2);
  end;



GOSTEI 0
Spooner

Spooner

24/02/2005

Boa Tarde,

Se eu usar Form2.Show ao inves de Form2.ShowModal o formulario aparece e some na mesma hora, tem solução para tal?

Application.CreateForm(TForm2, Form2); try Form2.ShowModal; finally Form2.Release; // Resolve pendências FreeAndNil(Form2); end;



GOSTEI 0
Beppe

Beppe

24/02/2005

Spooner, isto se deve ao fato que ShowModal ´tranca´ a execução(do thread atual) até que seja fechado, enquanto Show retorna loga após sua exibição.

Uma solução:

Abrir:
Application.CreateForm(TForm2, Form2);
Form2.ShowModal;

Fechar: (dentro do OnClose do TForm2)
Action := caFree;



GOSTEI 0
Paulo_amorim

Paulo_amorim

24/02/2005

Olá

Uma solução: Abrir:
Application.CreateForm(TForm2, Form2);
Form2.ShowModal;<--esta linha
Fechar: (dentro do OnClose do TForm2)
Action := caFree;


Beppe, acho que na linha em que vc deu ShowModal do Form vc quis dizer o comando Show, não?

Até


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

24/02/2005

Paulo,

Com certeza sim. A propósito, gostaria de aproveitar e retificar também a minha mensagem:

Onde se lê:

Para formulários e versões mais recentes do Delphi (a partir do Delphi 6), use:

Leia-se:

Para formulários [b:2c6f38143b]modais[/b:2c6f38143b] e versões mais recentes do Delphi (a partir do Delphi 6), use:


GOSTEI 0
Beppe

Beppe

24/02/2005

Beppe, acho que na linha em que vc deu ShowModal do Form vc quis dizer o comando Show, não?

:P :wink:


GOSTEI 0
POSTAR