Devolver matriz desde formulario modal

18/05/2005 - 14:41 por Erik Weissman | Informe spam
Un saludo para todos.

Pido por favor, ayuda con lo siguiente.

Desde un formulario modal deseo devolver una matriz unidimensional de tres
filas. Hago lo siguiente:

1) En el formulario que lo llama, el codigo es
DO FORM opciones WITH parámetros ... TO aCopias

2) En el evento Unload del formulario modal "opciones" esta el codigo
RETURN Thisform.aValores > la matriz de datos que deseo devolver

Pero algo ocurre, pues en el formulario que llama intento usar los datos
recibidos en aCopias (variable que recoge los datos) y no hay manera, no me
salen mas que mensajes de errores.

Si alguien tiene alguna idea se agradece enormemente.

Muchas gracias de antemano

Saludos
Gonzalo Moreno
gonzmt@telefonica.net

Preguntas similare

Leer las respuestas

#1 Luis María Guayán
18/05/2005 - 14:21 | Informe spam
Prueba de pasar la matriz por referencia:

(quita el código del metodo Unload y agrega el nuevo parametro a la lista
del método Init)

DIMENSION aCopias(1)
DO FORM opciones WITH Param1, Param2, ..., @aCopias
FOR ln = 1 TO ALEN(aCopias)
? aCopias(ln)
ENDFOR


Luis María Guayán
Tucumán, Argentina
________________________________
SysOp de www.PortalFox.com
Microsoft Visual FoxPro MVP
________________________________
La palabra imposible solo figura
en el diccionario de los tontos


"Erik Weissman" escribió en el mensaje
news:
Un saludo para todos.

Pido por favor, ayuda con lo siguiente.

Desde un formulario modal deseo devolver una matriz unidimensional de tres
filas. Hago lo siguiente:

1) En el formulario que lo llama, el codigo es
DO FORM opciones WITH parámetros ... TO aCopias

2) En el evento Unload del formulario modal "opciones" esta el codigo
RETURN Thisform.aValores > la matriz de datos que deseo devolver

Pero algo ocurre, pues en el formulario que llama intento usar los datos
recibidos en aCopias (variable que recoge los datos) y no hay manera, no


me
salen mas que mensajes de errores.

Si alguien tiene alguna idea se agradece enormemente.

Muchas gracias de antemano

Saludos
Gonzalo Moreno



Respuesta Responder a este mensaje
#2 Erik Weissman
22/05/2005 - 20:01 | Informe spam
No estoy seguro de haber entendido bien lo que me propones. Me refiero a que
si quito el código del Unload del formulario modal ¿como devuelvo los
valores que me interesan (incluidos en la matriz) desde este formulario
modal al formulario que lo llamó?


Saludos
Gonzalo Moreno



"Luis María Guayán" escribió en el mensaje
news:
Prueba de pasar la matriz por referencia:

(quita el código del metodo Unload y agrega el nuevo parametro a la lista
del método Init)

DIMENSION aCopias(1)
DO FORM opciones WITH Param1, Param2, ..., @aCopias
FOR ln = 1 TO ALEN(aCopias)
? aCopias(ln)
ENDFOR


Luis María Guayán
Tucumán, Argentina
________________________________
SysOp de www.PortalFox.com
Microsoft Visual FoxPro MVP
________________________________
La palabra imposible solo figura
en el diccionario de los tontos


"Erik Weissman" escribió en el mensaje
news:
Un saludo para todos.

Pido por favor, ayuda con lo siguiente.

Desde un formulario modal deseo devolver una matriz unidimensional de
tres
filas. Hago lo siguiente:

1) En el formulario que lo llama, el codigo es
DO FORM opciones WITH parámetros ... TO aCopias

2) En el evento Unload del formulario modal "opciones" esta el codigo
RETURN Thisform.aValores > la matriz de datos que deseo devolver

Pero algo ocurre, pues en el formulario que llama intento usar los datos
recibidos en aCopias (variable que recoge los datos) y no hay manera, no


me
salen mas que mensajes de errores.

Si alguien tiene alguna idea se agradece enormemente.

Muchas gracias de antemano

Saludos
Gonzalo Moreno







Respuesta Responder a este mensaje
#3 Alex Feldstein
22/05/2005 - 20:55 | Informe spam
On Sun, 22 May 2005 19:01:22 +0100, "Erik Weissman"
wrote:

No estoy seguro de haber entendido bien lo que me propones. Me refiero a que
si quito el código del Unload del formulario modal ¿como devuelvo los
valores que me interesan (incluidos en la matriz) desde este formulario
modal al formulario que lo llamó?



Como te dijo LuisMa, pasando el array por referencia no por valor
@aCopias en lugar de aCopias
De esa forma estas modificando el array original del programa u objeto
que lo llamó.


Alex Feldstein
________________________________
Microsoft Visual FoxPro MVP
Please respond in the public groups so that everybody
can benefit from the exchange.
Favor de responder en los foros públicos asi todos se benefician.
(address munged with ROT-13)

Blog: http://www.bloglines.com/blog/AlexFeldstein
Website: http://feldstein.net
Respuesta Responder a este mensaje
#4 Fabián Tomás de Paula
23/05/2005 - 15:07 | Informe spam
Si en vez de devolver un ARRAY directamente porque no devolves un Objeto que
contenga dicho array. Por lo que se desde la versión más vieja de Foxpro, un
Array es reconocido como tal dentro de una Función si el valor es enviado
como Referencia como te dijeron Alex y Luis María., por lo tanto, las
modificaciones que hagas en la Función que lo recibe modifica directamente
el ARRAY, al termino de la función podés devolver un valor .T. o .F. o bien
la cantidad de elementos del ARRAY, el cual te dirá si el proceso fue
exitoso o no.

Sin involucrar formularios sería algo así.

EXTERNAL ARRAY aArray2Modify
LOCAL aArray2Modify, cLastUDFParms, nIndex

cLastUDFParms = SET("UDFPARMS")

SET UDFPARMS TO REFERENCE && Mira la ayuda de éste comando

nCount = GalletitasdelKiosko(@aArray2Modify) && Cuando colocamos @ delante
de un parámetros

&& obligamos a que éste sea por referencia.

IF nCount > 0
* Recorro el Array devuelto por la función. Recordar que aArray2Modify
al crearse no era un array
* Quien modificó dicha condición fue la función.

FOR nIndex = 1 TO ALEN(nCount, 1)
?aArray2Modify[nIndex]
ENDFOR
ENDIF

SET UDFPARMS TO &cLastUDFParms


FUNCION GalletitasdelKiosko
LPARAMETERS aArray2Modify

DECLARE aArray2Modify[4]

aArray2Modify[1] = "GALLETITAS LINCOLN"
aArray2Modify[2] = "GALLETITAS SONRISAS"
aArray2Modify[3] = "GALLETITAS RUMBA"
aArray2Modify[4] = "GALLETITAS MELLISAS"

RETURN ALEN(aArray2Modify, 1)

Ahora involucrando a formularios, yo lo solucioné así ya que me parecía lo
escrito anteriormente muy engorroso, y en formularios mucho mas.

LOCAL nIndex, oReturnValue

DO FORM MiFormulario TO oReturnValue

*!* Fijate lo que hago en el INIT de ese formulario que llame y el UNLOAD.

IF TYPE("oReturnValue") == "O" AND PEMSTATUS(oReturnValue, "ArrayaDevolver",
5)
* Recorro el Array devuelto por el Formulario..

With oReturnValue
FOR nIndex = 1 TO ALEN(.ArrayaDevolver, 1)
?.ArrayaDevolver[nIndex]
ENDFOR
EndWith
ENDIF

FUNCTION Init && Formulario MiFormulario
LPARAMETERS a_DatosdeMiArray

With This
.AddProperty("ArrayaDevolver[1]", .F.)

DECLARE .ArrayaDevolver[4]

.ArrayaDevolver[1] = "GALLETITAS LINCOLN"
.ArrayaDevolver[2] = "GALLETITAS SONRISAS"
.ArrayaDevolver[3] = "GALLETITAS RUMBA"
.ArrayaDevolver[4] = "GALLETITAS MELLISAS"
EndWith

*!*
*!* Tu formulario puede trabajar con éste array sin problemas en todo tu
formulario
*!*
ENDFUNC


*!*
*!* Llamadas externas
*!*
*!* GetObjectData()
*!*
FUNCTION UnLoad && Formulario MiFormulario
LOCAL oReturnValue

oReturnValue = GetObjectData()

ADDPROPERTY(oReturnValue, "ArrayaDevolver[1]", .F.)

With This
DECLARE oReturnValue.ArrayaDevolver[ALEN(.ArrayaDevolver,1)] && Me
garantizo que los array

&& tengan el mismo tamaño

&& antes de copiar.
ACOPY(.ArrayaDevolver, oReturnValue.ArrayaDevolver)
EndWith

RETURN oReturnValue


*!*
*!* Tu formulario puede trabajar con éste array sin problemas en todo tu
formulario
*!*
ENDFUNC

En el INIT del formulario yo creo un ARRAY totalmente arbitrario, vos
también podes crear directamente el array en el UNLOAD, con datos que
contenga el formulario. La función GetObjectData está escrita abajo.
Espero haber sido claro en mi exposición. Saludos.

Saludos. Fabián

PD: No se desde que versión de VFP esta el comando SCATTER NAME, alguien que
me ayude. Gracias.

*!*
*!* La Función devuelve la Referencia de una Variabla de tipo Objeto sin
ninguna propiedad o método asociada.
*!*
*!* oData = GetObjectData()
*!*
FUNCTION GetObjectData
LOCAL nCurrArea

nCurrArea = SELECT()

CREATE CURSOR QueryTemp (Nada N(1))

SCATTER NAME oReturnObject BLANK

REMOVEPROPERTY(oReturnObject, "Nada")

USE

SELECT(nCurrArea)

RETURN oReturnObject








"Alex Feldstein" escribió en el mensaje
news:
On Sun, 22 May 2005 19:01:22 +0100, "Erik Weissman"
wrote:

No estoy seguro de haber entendido bien lo que me propones. Me refiero a
que
si quito el código del Unload del formulario modal ¿como devuelvo los
valores que me interesan (incluidos en la matriz) desde este formulario
modal al formulario que lo llamó?



Como te dijo LuisMa, pasando el array por referencia no por valor
@aCopias en lugar de aCopias
De esa forma estas modificando el array original del programa u objeto
que lo llamó.


Alex Feldstein
________________________________
Microsoft Visual FoxPro MVP
Please respond in the public groups so that everybody
can benefit from the exchange.
Favor de responder en los foros públicos asi todos se benefician.
(address munged with ROT-13)

Blog: http://www.bloglines.com/blog/AlexFeldstein
Website: http://feldstein.net
Respuesta Responder a este mensaje
#5 Erik Weissman
26/05/2005 - 18:34 | Informe spam
MUCHAS GRACIAS a todos y perdón porque no capté a la primera. Sus
sugerencias me han sido de mucha ayuda.
Repito, muchas gracias.


Saludos
Gonzalo Moreno



"Fabián Tomás de Paula" escribió en el mensaje
news:
Si en vez de devolver un ARRAY directamente porque no devolves un Objeto
que contenga dicho array. Por lo que se desde la versión más vieja de
Foxpro, un Array es reconocido como tal dentro de una Función si el valor
es enviado como Referencia como te dijeron Alex y Luis María., por lo
tanto, las modificaciones que hagas en la Función que lo recibe modifica
directamente el ARRAY, al termino de la función podés devolver un valor
.T. o .F. o bien la cantidad de elementos del ARRAY, el cual te dirá si el
proceso fue exitoso o no.

Sin involucrar formularios sería algo así.

EXTERNAL ARRAY aArray2Modify
LOCAL aArray2Modify, cLastUDFParms, nIndex

cLastUDFParms = SET("UDFPARMS")

SET UDFPARMS TO REFERENCE && Mira la ayuda de éste comando

nCount = GalletitasdelKiosko(@aArray2Modify) && Cuando colocamos @
delante de un parámetros

&& obligamos a que éste sea por referencia.

IF nCount > 0
* Recorro el Array devuelto por la función. Recordar que aArray2Modify
al crearse no era un array
* Quien modificó dicha condición fue la función.

FOR nIndex = 1 TO ALEN(nCount, 1)
?aArray2Modify[nIndex]
ENDFOR
ENDIF

SET UDFPARMS TO &cLastUDFParms


FUNCION GalletitasdelKiosko
LPARAMETERS aArray2Modify

DECLARE aArray2Modify[4]

aArray2Modify[1] = "GALLETITAS LINCOLN"
aArray2Modify[2] = "GALLETITAS SONRISAS"
aArray2Modify[3] = "GALLETITAS RUMBA"
aArray2Modify[4] = "GALLETITAS MELLISAS"

RETURN ALEN(aArray2Modify, 1)

Ahora involucrando a formularios, yo lo solucioné así ya que me parecía lo
escrito anteriormente muy engorroso, y en formularios mucho mas.

LOCAL nIndex, oReturnValue

DO FORM MiFormulario TO oReturnValue

*!* Fijate lo que hago en el INIT de ese formulario que llame y el UNLOAD.

IF TYPE("oReturnValue") == "O" AND PEMSTATUS(oReturnValue,
"ArrayaDevolver", 5)
* Recorro el Array devuelto por el Formulario..

With oReturnValue
FOR nIndex = 1 TO ALEN(.ArrayaDevolver, 1)
?.ArrayaDevolver[nIndex]
ENDFOR
EndWith
ENDIF

FUNCTION Init && Formulario MiFormulario
LPARAMETERS a_DatosdeMiArray

With This
.AddProperty("ArrayaDevolver[1]", .F.)

DECLARE .ArrayaDevolver[4]

.ArrayaDevolver[1] = "GALLETITAS LINCOLN"
.ArrayaDevolver[2] = "GALLETITAS SONRISAS"
.ArrayaDevolver[3] = "GALLETITAS RUMBA"
.ArrayaDevolver[4] = "GALLETITAS MELLISAS"
EndWith

*!*
*!* Tu formulario puede trabajar con éste array sin problemas en todo tu
formulario
*!*
ENDFUNC


*!*
*!* Llamadas externas
*!*
*!* GetObjectData()
*!*
FUNCTION UnLoad && Formulario MiFormulario
LOCAL oReturnValue

oReturnValue = GetObjectData()

ADDPROPERTY(oReturnValue, "ArrayaDevolver[1]", .F.)

With This
DECLARE oReturnValue.ArrayaDevolver[ALEN(.ArrayaDevolver,1)] && Me
garantizo que los array

&& tengan el mismo tamaño

&& antes de copiar.
ACOPY(.ArrayaDevolver, oReturnValue.ArrayaDevolver)
EndWith

RETURN oReturnValue


*!*
*!* Tu formulario puede trabajar con éste array sin problemas en todo tu
formulario
*!*
ENDFUNC

En el INIT del formulario yo creo un ARRAY totalmente arbitrario, vos
también podes crear directamente el array en el UNLOAD, con datos que
contenga el formulario. La función GetObjectData está escrita abajo.
Espero haber sido claro en mi exposición. Saludos.

Saludos. Fabián

PD: No se desde que versión de VFP esta el comando SCATTER NAME, alguien
que me ayude. Gracias.

*!*
*!* La Función devuelve la Referencia de una Variabla de tipo Objeto sin
ninguna propiedad o método asociada.
*!*
*!* oData = GetObjectData()
*!*
FUNCTION GetObjectData
LOCAL nCurrArea

nCurrArea = SELECT()

CREATE CURSOR QueryTemp (Nada N(1))

SCATTER NAME oReturnObject BLANK

REMOVEPROPERTY(oReturnObject, "Nada")

USE

SELECT(nCurrArea)

RETURN oReturnObject








"Alex Feldstein" escribió en el mensaje
news:
On Sun, 22 May 2005 19:01:22 +0100, "Erik Weissman"
wrote:

No estoy seguro de haber entendido bien lo que me propones. Me refiero a
que
si quito el código del Unload del formulario modal ¿como devuelvo los
valores que me interesan (incluidos en la matriz) desde este formulario
modal al formulario que lo llamó?



Como te dijo LuisMa, pasando el array por referencia no por valor
@aCopias en lugar de aCopias
De esa forma estas modificando el array original del programa u objeto
que lo llamó.


Alex Feldstein
________________________________
Microsoft Visual FoxPro MVP
Please respond in the public groups so that everybody
can benefit from the exchange.
Favor de responder en los foros públicos asi todos se benefician.
(address munged with ROT-13)

Blog: http://www.bloglines.com/blog/AlexFeldstein
Website: http://feldstein.net




Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida