|
|
|
|
|
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
|
|
|
|
|