Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Form ou Menu ?
Message
From
25/05/2002 01:50:49
 
General information
Forum:
Visual FoxPro
Category:
Forms & Form designer
Title:
Miscellaneous
Thread ID:
00661128
Message ID:
00661328
Views:
36
>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
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform