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" ENDDEFINEAgora 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" ENDDEFINESem dúvidas, o Garbage Collection é um problema, mas que dependendo de como programamos em dadas situações, pode ser evitado.