OBJECT OU CONTROL?

JALEXM 21/03/2012 09:52:06
#397795
Olá.
Às vezes, preciso passar um controle como parâmetro de um sub ou função para poder alterar suas propriedades.
O que é melhor: passar como Object ou Control? Não vejo diferença.
Também não vejo diferença entre passar ByVal ou ByRef.
Poderia esclarecer a questão?
Obrigado.
LLAIA 21/03/2012 10:40:42
#397804
Bom, não posso afirmar, mas pelo que percebo pelo Object Browser do VB6, [txt-color=#0000f0]Object[/txt-color] seria uma espécie de pai de todos objetos na hierarquia do VB6. O interessante é que Object não é uma classe, mas uma palavra reservada ao contrário de Control. Sabemos que VB6 não tem herança, mas observando a propriedade Controls na classe UserControl dá pra notar que ela tem como referência Object.


Property Controls As object
read-only
Member of VB.UserControl
A collection whose elements represent each control on a form, including elements of control arrays.


Se a [Ô]hierarquia[Ô] for essa:

Object
|
|---> Control


Como a relação em herança é do tipo [ô]é um[ô], deve ser por isso que não dá problema quando vc usa um ou outro.


Quanto ao ByRef e o ByVal, faça esse teste. Uma vez com Byval na função calcula e outra com byRef e tire sua conclusões:

Function calcula(ByVal x As Integer) As Integer
x = x * 2
calcula = x
End Function


Private Sub Form_Load()

Dim x As Integer
x = 3

MsgBox calcula(x)
MsgBox x


End Sub


ANDPAG 21/03/2012 15:49:01
#397883
o byval voce apenas passa o valor para o parametro, ja o byref voce passa a referencia, por exemplo se vc passa um byref oGrid as msflexgrid tudo que voce inserir nesse ogrid ele autmaticamente lanca no grid referente ao parametro,,, funciona como um link....
JALEXM 21/03/2012 16:47:38
#397893
Citação:

:
o byval voce apenas passa o valor para o parametro, ja o byref voce passa a referencia, por exemplo se vc passa um byref oGrid as msflexgrid tudo que voce inserir nesse ogrid ele autmaticamente lanca no grid referente ao parametro,,, funciona como um link....



Eu entendi como funciona o ByVal e ByRef.
Acontece que quando eu passo um controle como Objeto ou Control tanto faz.
Para outras variáveis isso não acontece.
KERPLUNK 21/03/2012 17:40:38
#397898
Tanto faz, porque tudo no VB6 é originado de objeto, ou seja, tudo que pode ser [Ô]transformado[Ô] em object vai estar valendo. Se o parâmetro fosse de um tipo de objeto específico e você passa como parâmetro um outro objeto(por exemplo, o parâmetro espera uma textbox e você passa um botão), aí poderia ter algum problema, dependendo do que o método faz.
JALEXM 23/03/2012 09:47:26
#398028
Citação:

:
Tanto faz, porque tudo no VB6 é originado de objeto, ou seja, tudo que pode ser [Ô]transformado[Ô] em object vai estar valendo. Se o parâmetro fosse de um tipo de objeto específico e você passa como parâmetro um outro objeto(por exemplo, o parâmetro espera uma textbox e você passa um botão), aí poderia ter algum problema, dependendo do que o método faz.



Entendi isso também.
O que não entendo é que se passamos alguma coisa (objeto, controle, string, etc.) usando ByVal, então não deveria ser permitido fazer alterações. Seria uma forma de proteger contra alterações acidentais, que aliás é uma das funções de ByVal e ByRef. Mas quando se passa um Control usando ByVal as alterações são permitidas. Isso aí é que não estou entendendo.
KERPLUNK 23/03/2012 11:23:35
#398070
Citação:

Mas quando se passa um Control usando ByVal as alterações são permitidas. Isso aí é que não estou entendendo.


Nada impede de se alterar valores de um parâmetro passado para um método. Seja ele do tipo que for, pode ser alterado normalmente, não há nenhuma restrição quanto à isso.
JALEXM 23/03/2012 13:40:04
#398091
Citação:

Nada impede de se alterar valores de um parâmetro passado para um método. Seja ele do tipo que for, pode ser alterado normalmente, não há nenhuma restrição quanto à isso.



Como assim???
Tente esse código:

Private Sub Command1_Click()
Dim S As String
S = [Ô]abc[Ô]
Alterar S
MsgBox S
End Sub

Private Sub Alterar(ByRef St As String) [ô]<--- mude aqui para ByVal e veja a diferença.
St = [Ô]xyz[Ô]
End Sub


Tópico encerrado , respostas não são mais permitidas