USUÁRIO:      SENHA:        SALVAR LOGIN ?    Adicione o VBWEB na sua lista de favoritos   Fale conosco 

 

  Dicas

  Visual Basic    (Forms/MDI)

Título da Dica:  Resolvendo problema com Load do Form e Set =Nothing
Postada em 1/9/2003 por Ð@®l@n            
Passeando por diversos sites vi dicas sobre ser cuidadoso com o Nothing devido a problemas com o Load.

Realmente, se você fizer o seguinte código :

Form2.Text1.Text = "testando"
Set Form2 = Nothing

Sem ter se referido ao form2 em momento algum antes terá sérios problemas. Vamos por partes : Set form2=nothing destroi o form, certo ?

Errado ! Set form2=nothing destroi o ponteiro para o form que está contido na variável form2. Quem destroi o form é um pequeno agente que acompanha sua aplicação e é chamado de Garbage Collector.

Mas o Garbagge Collector só destroi o form quando não houver mais nenhum ponteiro se referindo a ele. Dai o problema causado pela instrução anterior :

Form2.Text1.Text = "testando"

Por estar setando o valor da propriedade de um componente esta instrução causa 2 eventos : Initialize e load. O load carrega os componentes do form e gera em memória ponteiros para o form. Assim sendo, quando utilizamos set form2=nothing o form não é realmente eliminado, pois existem outros ponteiros para ele.

Desta forma, ao utilizarmos o Unload me no form principal para fecharmos a aplicação esta não se encerra por completo, deixando ainda um form carregado em RAM.

Até aqui isso já havia sido exposto por outros site. Mas e ai, qual a solução ? A questão é : Onde está o ponteiro que está apontando para o form (wally?) ?

Eis o grande mistério : O ponteiro criado pelo load fica guardado dentro da coleção FORMS do Vb, que contém todos os forms carregados em RAM. Assim sendo, se ao invés de darmos um simples unload me ao fechar a aplicação vasculharmos toda a coleção FORMS, resolveremos assim o problema do wally (ops.. ponteiro) perdido.

Veja :

Dim f as form
for each f in forms
unload f
next

Esta fica sendo então a forma mais confiável de fechar a aplicação.

Por outro lado, se não quisessemos fechar a aplicação mas apenas eliminar o form perdido da RAM, também recorreríamos a coleção FORMS :

Dim f as form
for each f in forms
if ucase(f.name)="FORM2" then
unload f
end if
next
 


CyberWEB Network Ltda.    © Copyright 2000-2024   -   Todos os direitos reservados.
Powered by HostingZone - A melhor hospedagem para seu site
Topo da página