Qual a melhor maneira de trabalhar com os FROMS??
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:
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 para aparecer.
Tem algum outro modo melhor de se trabalhar com eles???
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
Tem algum outro modo melhor de se trabalhar com eles???
Armando.boza
Curtidas 0
Respostas
Armando.boza
24/02/2005
Desculpe pelo Título... é FORMS
GOSTEI 0
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:
E no OnClose do Form:
Abraços
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
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
24/02/2005
para abrir eu uso assim:
e para fechar como foi citado pelo ´tnaires´
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
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)
form1 := Tform1.create(self)//ou application
try
form1.showmodal;
finally
form1.Release;
form1 := nil;
end;
8)
GOSTEI 0
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
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
24/02/2005
Legal pessoal.... muito obrigado pelas respostas...
No caso deste exemplo de nosso amigo... o que significa o finally e o release???
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
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
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
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
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é+
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
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
24/02/2005
De uma olhada nesta dica...
http://www.linhadecodigo.com.br/dicas.asp?id_dica=1042&sub=14
http://www.linhadecodigo.com.br/dicas.asp?id_dica=1042&sub=14
GOSTEI 0
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
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
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
24/02/2005
Muito obrigado pessoal....
Fiz alguns testes a aparentemente os erros desapareceram.
Fico muito grato pela ajuda que me forneceram.
Att
Armando
Fiz alguns testes a aparentemente os erros desapareceram.
Fico muito grato pela ajuda que me forneceram.
Att
Armando
GOSTEI 0
Armando.boza
24/02/2005
pessoal.. agora está funcionando perfeitamente..
aqueles erros pararam de aparecer...
muito obrigado a todos
Att
Armando
aqueles erros pararam de aparecer...
muito obrigado a todos
Att
Armando
GOSTEI 0
Aroldo Zanela
24/02/2005
Colega,
Para formulários e versões mais recentes do Delphi (a partir do Delphi 6), use:
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
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?
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
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:
Fechar: (dentro do OnClose do TForm2)
Uma solução:
Abrir:
Application.CreateForm(TForm2, Form2); Form2.ShowModal;
Fechar: (dentro do OnClose do TForm2)
Action := caFree;
GOSTEI 0
Paulo_amorim
24/02/2005
Olá
Beppe, acho que na linha em que vc deu ShowModal do Form vc quis dizer o comando Show, não?
Até
Uma solução:
Abrir:
Fechar: (dentro do OnClose do TForm2)
Application.CreateForm(TForm2, Form2); Form2.ShowModal;<--esta linha
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
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:
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
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