Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Form ou Menu ?
Message
De
25/05/2002 01:50:49
 
Information générale
Forum:
Visual FoxPro
Catégorie:
Gestionnaire d'écran & Écrans
Titre:
Divers
Thread ID:
00661128
Message ID:
00661328
Vues:
35
>O VFP tem um problema sério... Eu já tentei passar um oFORM e consegui... O problema vem depois!
>O VFP não consegue fechar o formulario A se não anularmos todas as instancias externas dele. Até saiu um artigo do Walfrans na rapozine sobre isso...
>Concordo plenamente que passar o oForm para o formulário seguinte é lindo, mas não é funcional... o VFP tem esse problema... Alias, como se chama? Gabarage? algo assim...


hehe... é Garbage Collection. Ou seja, temos um objeto, e em algum outro pronto criamos alguma referência a este objeto ou qualquer um de seus componentes. Se tentarmos remover o objeto da memória, parecerá que ele se foi, mas na verdade, ainda estará em um canto lá, por causa da referência sendo utilizada no segundo objeto.

Mas para este caso dos Forms, tudo depende de o que está se tentando fazer. Veja os exemplos:
Public oForm1, oForm2

** para acompanhar o código...
Set Step On

oForm1 = CreateObject("Form1")
oForm2 = CreateObject("Form2")

oForm1.Visible = .T.

** form sendo passado como uma referência.
oForm1.Ref(oForm2)

** form sendo liberado...
Release oForm2

** Vartype informa que o form2 foi liberado.
** Olhe na janela Locals, e verá que realmente foi...
MessageBox(Vartype(oForm2))


DEFINE CLASS Form1 AS form

PROCEDURE Ref(toForm2)
   ** Neste caso, tenho o form aqui dentro, mas não crio
   ** referência a ele; apenas utilizo seus membros internos.
	this.Caption=toForm2.txtTeste.Value
ENDPROC

ENDDEFINE


DEFINE CLASS Form2 AS form
	
	Add Object txtTeste as TextBox 
	txtTeste.Value = "sou o Form 2"

ENDDEFINE
Agora um exemplo problemático:
Public oForm1, oForm2

Set Step On

oForm1 = CreateObject("Form1")
oForm2 = CreateObject("Form2")

oForm1.Visible = .T.

oForm1.Ref(oForm2)

Release oForm2

** Vartype dirá que o form foi liberado, o que não é verdade.
** basta olhar na janela locals, e verá a referência ainda mantida
** na propriedade oRefTxtForm... (apesar de oForm2 ter sumido da Locals)
MessageBox(Vartype(oForm2))

DEFINE CLASS Form1 AS form

oRefTxtForm1 = null

PROCEDURE Ref(toForm2)
   ** veja que agora armazeno uma referência a um componente do form
   ** em uma variável deste form aqui...
	this.oRefTxtForm1 = toForm2.txtTeste
	this.Caption=this.oRefTxtForm1.Value
ENDPROC

ENDDEFINE

DEFINE CLASS Form2 AS form
	
	Add Object txtTeste as TextBox 
	
	txtTeste.Value = "sou o Form 2"

ENDDEFINE
Sem dúvidas, o Garbage Collection é um problema, mas que dependendo de como programamos em dadas situações, pode ser evitado.

Neste ponto, o C# é bem interessante, já que gerencia isso pra nós. :)
Claudio Lassala
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform