Visual Basic - Pregunto

Life is soft - evento anual de software empresarial
 
Vista:

Pregunto

Publicado por Santiago (27 intervenciones) el 19/03/2007 00:42:33
hola quisiera sacarme una duda :
cual es la diferencia enrntre llamar a un procedimiento con CALL proc1(arg1,arg2....) y sin CALL o sea proc1 arg1, arg2 ...

gracias y espero puedan ayudar
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Más dudas

Publicado por benjo (679 intervenciones) el 19/03/2007 02:32:12
Santiago
Generalmente los argumentos entre corchetes, se utiliza para Funciones, cuya devolución se guarda en una variable, o es evaluada en un bloque If o case
Un procedimiento o subrutina como no devuelve ningún valor, no es preciso escribirla entre corchetes.
Pero en sí la instrucción call se encarga de transferir el proceso o hilo de programación a una función o una subrutina. Su utilización es opcional y sirve solo en caso de las funciones para descartar el valor de devolución.

Microsoft dice:

No es necesario que utilice la palabra clave Call cuando llama a un procedimiento. Sin embargo, si utiliza la palabra clave Call para llamar a un procedimiento que requiere los argumentos, listaargumentos debe estar entre paréntesis. Si omite la palabra clave Call, debe omitir también los paréntesis de listaargumentos. Si utiliza cualquiera de las formas de la sintaxis Call para llamar a cualquier función intrínseca o a una función definida por el usuario, se descartará el valor devuelto por la función.

Lo comico, es que aunque no pongas la instruccion Call, y coloques la Función sin corchetes y con sus respectivos argumentos, si no evaluas la devolución de la función o bien si no la guardás en una variable, la devolución se descarta igual.

Entonces nos queda una sola pregunta. Para que Microsoft puso la Instrucción Call en el Lenguaje.
Dos respuestas lógicas pueden ser

1) Compatibilidad con versiones anteriores, por ejemplo en la Version 3 era obligatorio en los procedimientos.

2) Quizás fue por convención de programación.

Sea lo que sea. Nunca lo sabremos con certeza.
Como tampoco sabemos porque extraño motivo subsiste aún la función GoSub, o la Instrucción End.
Si su utilización ha sido y son tan criticada por el mismo Microsoft.

Puede que algún purista, alguna vez pase por estas líneas.y nos aclare estos puntos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Más dudas

Publicado por Santiago (27 intervenciones) el 19/03/2007 22:22:38
gracias benjo por tu respuesta pero mi pregunta se va ma aun ejemplo que me paso y a lo mejor me lo puedas explicar:

me defino un objeto recordset en un procedimiento de la siguiente manera

recordsetaux as new recordset

with recordsetaux
cargo la coneccion
defino tipo de cursor
defino tipo de bluqueo
cargo le source
lo abro
llamo al procedimeinto
end with

cuando llamo al procedimeinto que recibe como parametro un recordset
pero al llamarlo sin el call me decia que el tipo que pasaba como paarametro no era = que el que definia en el procedimeinto, pero al llamar al procedimeito con CALL andubo de 10, porque nose????


si tu me puedes sacar esa duda bienvenida sera gracias!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Más dudas

Publicado por Benjo (679 intervenciones) el 20/03/2007 02:13:42
Santiago

En realidad, probé una función y un procedimiento como el que mencionás, invocandolo tanto con call, como sin call, como función o como subrutina, pero en ningún momento me generó un error al recibir el argumento

Private Sub Form_Load()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Archivos de programa\Microsoft Visual Studio\VB98\Biblio.mdb;Persist Security Info=False"
cnn.Open
rs.Open "SELECT * FROM Authors", cnn
' Lo paso como una función con call
Call pasarecordset(rs)
' Lo paso como una función sin call
pasarecordset rs
' Lo paso como un procedimiento con call
Call PasaRecordsetEnSub (rs)
' Lo paso como un procedimiento sin call
PasaRecordsetEnSub rs

rs.Close :Set rs = Nothing
cnn.Close : Set cnn = Nothing
End Sub

Private Function pasarecordset(ByRef rec As ADODB.Recordset) As Boolean
'En cada caso probé pasarlo por referencia y por valor, pero todo anduvo bien
For i = 1 to 10
Debug.Print rec!Author
rec.MoveNext
next
End Function

Private Sub PasaRecordsetEnSub(ByRef rec As ADODB.Recordset)
'En cada caso probé pasarlo por referencia y por valor, pero todo anduvo bien
For i = 1 to 10
Debug.Print rec!Author
rec.MoveNext
next
End Sub

Si expusieras tu codigo, tal vez hallariamos el error, igual lo solucionaste. Tan grave no fue, solo digamos que resulta intrigante.

En fin. mucha suerte con tu proyecto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar