Pregunta tonta [ Each & Static ]

Iniciado por Sancho.Mazorka, 21 Junio 2007, 18:05 PM

0 Miembros y 1 Visitante están viendo este tema.

Sancho.Mazorka

Hola forer@s, vengo a hacerles 2 preguntas que seguro les pareceran muy tontas y mas con la experiencia que tengo  :( 
1_ Cuando es posiblre usar la funcion Each, si no me equivoco es cuando tenes como una variable con matriz.
2_ La funcion Static para definir una variable, para que sirve ?  Es para hacer una funcion y que la variable que vos definis obtenga el resultado ?

Ej:
Private Sub Form_Load()
   Dim Valor_Aqui As String
   Call Colocar(Valor_Aqui)
End Sub

Private Sub Colocar(Variable as String)
   Static Variable
   Variable = 2
End sub


Si mi teoria esta bien, cuando a Variable le asignamos 2, en realidad le estamos dando valor a Valor_Aqui  :huh:

Si no es como digo, por favor aclarenme para que es Static  :)   Y si tienen ganas, me dicen como serial la forma correcta de hacer mi ejemplo, para que 2 se guarde en Valor_Aqui ?

Muchas Gracias


Sancho.Mazorka    :¬¬
Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html



Hans el Topo


No hace falta el static, cuando envias un valor, por defecto lo hace por referencia, por lo tanto al cambiarlo lo cambias en el original xD

Private Sub Form_Load()
   Dim Valor_Aqui As String
   Call Colocar(Valor_Aqui)
End Sub

Private Sub Colocar(Variable as String)
   Variable = 2
End sub


Si lo usas como función

Private Sub Form_Load()
   Dim Valor_Aqui As String
   Valor_Aqui=Colocar()
End Sub

Private function Colocar()
   Colocar = 2
End function



Según la MSDN:


EACH
For Each...Next (Instrucción)
     

Repite un grupo deinstrucciones para cada elemento de unamatriz ocolección.

Sintaxis

For Each elemento In grupo
[instrucciones]
[Exit For]
[instrucciones]

Next [elemento]

La sintaxis de la instrucción For Each...Next consta de las siguientes partes:

Parte Descripción
elemento Requerido.Variable que se utiliza para iterar por los elementos del conjunto o matriz. Para conjuntos, elemento solamente puede ser una variable deltipo Variant, una variable de objeto genérica o cualquier variable de objeto específica. Para matrices, elemento solamente puede ser una variable tipo Variant.
grupo Requerido. Nombre de un conjunto de objetos o de una matriz (excepto una matriz detipos definidos por el usuario).
instrucciones Opcional. Una o más instrucciones que se ejecutan para cada elemento de un grupo.


Comentarios

La entrada al bloque For Each se produce si hay al menos un elemento en grupo. Una vez que se ha entrado en el bucle, todas las instrucciones en el bucle se ejecutan para el primer elemento en grupo. Después, mientras haya más elementos en grupo, las instrucciones en el bucle continúan ejecutándose para cada elemento. Cuando no hay más elementos en el grupo, se sale del bucle y la ejecución continúa con la instrucción que sigue a la instrucción Next.

Se pueden colocar en el bucle cualquier número de instrucciones Exit For. La instrucción Exit For se utiliza a menudo en la evaluación de alguna condición (por ejemplo, If...Then) y transfiere el control a la instrucción que sigue inmediatamente a la instrucción Next.

Puede anidar bucles For Each...Next, colocando un bucle For Each...Next dentro de otro. Sin embargo, cada elemento del bucle debe ser único.

Nota   Si omite elemento en una instrucción Next, la ejecución continúa como si se hubiera incluido. Si se encuentra una instrucción Next antes de su instrucción For correspondiente, se producirá un error.

No se puede utilizar la instrucción For Each...Next con una matriz de tipos definidos por el usuario porque un tipo Variant no puede contener un tipo definido por el usuario.


STATIC
Static (Instrucción)
     

Se usa en elnivel de procedimiento para declararvariables y asignarles espacio de almacenamiento. Las variables declaradas con la instrucción Static conservan su valor mientras el código se está ejecutando.

Sintaxis

Static nombre_variable[([subíndices])] [As [New] tipo] [, nombre_variable[([subíndices])] [As [New] tipo]] . . .

La sintaxis de la instrucción Static consta de estas partes:

Parte Descripción
nombre_
variable Requerido. Nombre de la variable; sigue las convenciones estándar de nombres de variable.
subíndices Opcional. Dimensiones de una variable dematriz; se pueden declarar hasta 60 dimensiones múltiples. Elargumento subíndices usa la sintaxis siguiente:
[inferior To] superior [,[inferior To] superior] . . .

Cuando no se declara explícitamente en inferior, el límite inferior de una matriz se controla mediante la instrucción Option Base. Este límite inferior es cero si no hay ninguna instrucción Option Base.

New Opcional.Palabra clave que permite la creación implícita de un objeto. Si utiliza New cuando declara lavariable de objeto, se crea una nueva instancia del objeto como primera referencia, de forma que no tiene que utilizar la instrucción Set para asignar la referencia del objeto. La palabra clave New no se puede utilizar para declarar variables de cualquiertipo de datos intrínseco ni para declarar instancias de objetos dependientes.
tipo Opcional. Tipo de datos de la variable; puede serByte,Boolean,Integer,Long,Currency,Single,Double,Decimal (no admitida actualmente),Date,String, (para cadenas de longitud variable), String * length (para cadenas de longitud fija),Object,Variant, untipo definido por el usuario, o untipo de objeto. Use una cláusula As tipo distinto para cada variable que defina.


Comentarios

Una vez que el código delmódulo se está ejecutando, las variables declaradas con lainstrucción Static conservan su valor hasta que se reinicie o restablezca el módulo. En losmódulos de clase, las variables declaradas con la instrucción Static conservan su valor en cada instancia de clase hasta que se destruye la instancia. Enmódulos de formulario, las variables estáticas conservan su valor hasta que se cierra el formulario. Use la instrucción Static enprocedimientos no estáticos para declarar explícitamente variables que son visibles sólo dentro de un procedimiento, pero cuya vida es la misma que la del módulo en la que se definió el procedimiento.

Utilice una instrucción Static dentro de un procedimiento para declarar el tipo de datos de una variable que conserva su valor entre llamadas a procedimiento. Por ejemplo, la instrucción siguiente declara una matriz de enteros de tamaño fijo:

Static NúmeroDeEmpleados(200) As Integer

La siguiente línea declara una variable para una nueva instancia de una hoja de cálculo:

Static X As New Worksheet

Si la palabra clave New no se utiliza al declarar una variable de objeto, la variable que hace referencia a un objeto debe asignarse a un objeto existente mediante la instrucción Set antes de poder utilizarla. Antes de que se le asigne un objeto, la variable de objeto declarada tiene el valor especial Nothing, que indica que no hace referencia a ninguna instancia en particular de un objeto. Cuando utiliza la palabra clave New en ladeclaración, se crea una instancia del objeto en la primera referencia del mismo.

Si no especifica un tipo de datos o un tipo de objeto y no existe una instrucción Deftipo en el módulo, la variable es Variant de manera predeterminada.

Nota   La instrucción Static y la palabra clave Static son similares, pero se utilizan para conseguir efectos diferentes. Si declara un procedimiento con la palabra clave Static (como en Static Sub ContarVentas()), el espacio de almacenamiento correspondiente a todas las variables locales dentro del procedimiento se asigna una única vez y el valor de las variables se conserva durante todo el tiempo que se esté ejecutando el programa. Para procedimientos no estáticos, el espacio de almacenamiento para las variables se asigna cada vez que se llama al procedimiento y se libera cuando se sale del procedimiento. La instrucción Static se usa para declarar variables específicas dentro de procedimientos no estáticos para conservar su valor mientras el programa se esté ejecutando.

Al inicializar las variables, una variable numérica se inicializa a 0, una cadena de longitud variable se inicializa a una cadena de longitud cero ("") y una cadena de longitud fija se rellena con ceros. Las variables Variant se inicializan aEmpty. Cada elemento de una variable de un tipo definido por el usuario se inicializa como si fuera una variable distinta.

Nota   Cuando utilice instrucciones Static dentro de un procedimiento, colóquelas al principio del procedimiento con otras instrucciones de declaración como Dim.
 

Sancho.Mazorka

#2
Gracias Hans por lo del Each, pero con el Static yo me referia a como funciona el Winsock por ejemplo.

Ej:
Private Sub Winsock1_DataArrival(BytesTotal as integer)
Dim Datos As String
Winsock1.GetData Datos
End Sub


Yo quiero saber como hacer lo que hace el Winsock, que vos le das el nombre de la variable y te almacena ahi los datos de entrada, y ahi no es como vos me dijiste, a esos 2 metodos ya los conocia yo.
No se como hacer para que pongo Call funcion1(Datos) y me guarde en Datos el valor  (Datos es una parametro)


Sancho.Mazorka    :¬¬
Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html



Hans el Topo

pués dilo antes xD

no sé si te he entendido pero ahí vamos xD

el winsock es un objeto/clase...

cuando haces lo de los datos es el "buffer" de lectura del dato interno...  éste método se llama encapsulación...

creo que no tiene otro para cambiar el valor que ha recibido, de hecho no tendría mucho sentido


para que te guarde el valor, simplemente asignas... y si quieres asegurarte de que va a cambiarlo

pasas el valor como ByRef (es el modo predeterminado) y listo


dim datos as string
procedimiento datos

Private Sub procedimiento(ByRef algo as string)
  algo="pepito el de los palotes"
End Sub



no se si te entendí xD
 

Sancho.Mazorka

Entonces el que se encarga de hacer lo que pregunte es el ByRef ? Creo que esa era mi respuesta, ahora voy a probar, muchas gracias Hans, sos el unico que se molesto!


Sancho.Mazorka    :¬¬
Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html



ranslsad

Cita de: Sancho.Mazorka en 21 Junio 2007, 19:44 PM
sos el unico que se molesto!

Amigo yo con mi  experiencia conocia eso y siempre me pregunte pero nunca tuve idea sobre como se hacia.. muchos (o por lo menos yo) leo y miro si se y si no se a veces busco aprendo y respondo.. asi que muchos no se interesan pero otros no saben...

Bueno...

Salu2

Ranslsad

(lo vi en el quote)
Ranslsad - Archangel - RanSoft

ranslsad

#6
Cita de: Hans el Topo en 21 Junio 2007, 18:30 PM
dim datos as string
procedimiento datos

Private Sub procedimiento(ByRef algo as string)
  algo="pepito el de los palotes"
End Sub


Mira por ejemplo.. quiero haceer dos cosas...
si pongo
procedimiento box
sale un msgbox
pero si pongo
procedimiento text
se cambia un text o algo..
como seria el temita?

Salu2

Ranslsad
(sry por el doble post...)

Edit:
dando un poco de vueltas me di cuenta de eso!! y me encanto hans esto lo quise saber de hace tanto tiempo y nunca me dio por buscar.. gracias!! mira lo que hice..
Private Sub Command1_Click()
ema InputBox("Ema", "Escribe")
End Sub

Function ema(ByRef emaa)
MsgBox emaa
End Function


estas cosas tan sencillas son tan dificiles de encontrar (??)

Salu2

Ranslsad!!!

Hans el Topo

#7

el by ref es el modo estandar de enviar los datos que tiene visual (por referencia) usease son una especie de punteros que apuntan a la variable inicial, el tema esta en que eso de poner by ref no surte efecto ya que por defecto lo envia por referencia...
por contrapunto se suele poner by val cuando no quieres que cambie el valor y tal



Citarsos el unico que se molesto!
eso no me hace ni mejor ni peor, cada uno aporta lo que puede y quiere xD
 

ranslsad

Ah.. yo estuve investigando y me fui dando cuenta de las cosas oye..

1º > ByRef no hace falta..
2º > Cuantas mas variables creas mas opciones podes reflejar al llamarlo, por ejemplo:
Public Function ema(ema2 As String, ema3 As String)
MsgBox ema2 & " | " & ema3
End Function

Private Sub Command1_Click()
ema "hola", "chau"
End Sub


Me gusta :P y lo seguire investigando :)

Salu2

Ranslsad

Zeroql

miren la propiedad static es para hacer las cosas que se keden en un puntos sin cambios del usuario. creo que con eso solucinan tanta discucion.
bueno espero que mi acote les sirva de algo
Dime y lo olvido, enseñame y lo recuerdo, involucrame y lo aprendo.
/.-ZEROQL.-\   -----  #937675#