Saludos:
Como dice José F. Gimenez no me explico bien o no me has entendido
totalmente, veamos en el ejemplo que te he mandado, accedo a los datos
del padre a trevés de la ::oParent, incluso compruebo que el Browse
contiene datos, y si los contiene le paso los datos al hijo, pero como
el hijo es modal no me permitirá pasarle datos al padre, a no ser que el
hijo se cierre y si se cierra pierdo los datos, a no ser que al hijo le
active la propiedad lHideOnClose, que permite leer los datos del hijo
aún estando cerrado, pero cuidado que está cerrado no destruido, por lo
tanto tienes que ser tú el que una vez obtenidos los datos lo destruyas,
si no lo haces iras dejando formularios abiertos que ocupan memoria.
Ej.
Lo hago al vuelo. por lo tanto puede tener errores.
METHOD DbfBrowseFacturaColumn2BtnClick( oSender, Value ) CLASS
TFormFacturaClientes
WIHT OBJECT TFormBuscaArticulos():New(::oForm)
:lHideOnClose := .T.
// Puedo pasarle el valor al hijo, el valor de la columna2 antes
// de abrirlo
:oArticulo:Value := Value
:ShowModal()
// cierro el hijo pero con datos
IF :nModalResult == mrOK
// Obtener los valores del hijo y pasarlos al padre
// Usando oSender := columna2 del Browse donde estoy // posicionado
oSender:Value := :oArticulo:Value
// Usando el Browse
::oBrowse:variablecolumna:Value := :oArticulo:Value
// O tambien sobre la base de datos del Browse
::oBaseDatos:Campo := :oArticulo:Value
// O como lo hacías con datas sin la propiedad
// lHideOnClose a TRUE
::oBaseDatos:Campo := :DATA
// Refrescar el Browse
::DbfBrowseFactura:RefreshCurrent()
ENDIF
// Cierro y destruyo el hijo siempre lo hago tenga o no
// la propiedad lHideOnClose activada.
:End()
END
Fijate en los "::" cuando son datos del padre y ":" cuando son del
objeto llamado que es el hijo.
Espero que ahora me haya explicado mejor, y no haberme equivocado y
además te sirva de ayuda.
El ejemplo mandado en mi correo anterior también es valido, pero para
pasar datos entre padre y hijo, o comprobar datos del padre desde el hijo.
Veamos un ejemplo del uso de tres formularios, en una aplicación en la
que se quiere que el usuario no acceda a los datos del segundo
formulario, sin rellenar los datos del primero, y al tercero sin
rellenar los datos del segundo asociación padre-hijo-nieto, todas las
bases de datos estan en el padre, pero quiero utilizarlas en el nieto
que es el tercero pues aun así puedo acceder a ellas si hago bien las
asociaciones de los formulario al padre lo asocio con la ventana
principal donde se ejecuta New(Application:oMainForm), el segundo que es
llamado desde el padre New(::oForm) y el tercero que es llamado desde el
segundo New(::oForm), pues bien desde el tercero podré acceder a las
bases de datos del primero así: ::oParent:oParent:oDataBase.
José Ramón Castro.
Juan Castañeda escribió:
> Gracias tocayo yo me llamo Juan Ramón
>
> O sea que al pasarle el objeto ::oForm puedo acceder a mis controles del
> padre y modificarle sus datos? (hasta ahora guardaba mis datos en DATA y las
> recuperaba desde el padre)
>
> Si es así me parece muy bien, funciona como las variables private de
> clipper?
>
> Tengo tanto por aprender...
>
> Gracias nuevamente.
>
> "José Ramón Castro Polinio" <jrcpoli-quitarpara_envio]"@terra.es> escribió
> en el mensaje news:4922ae73$[email=
1@ozsrv2.ozlan.local...]
1@ozsrv2.ozlan.local...[/email]
>> Saludos:
>>
>> Prueba así:
>> METHOD DbfBrowseFacturaColumn2BtnClick( oSender, Value ) CLASS
>> TFormFacturaClientes
>> TFormBuscaArticulos():New(::oForm):ShowModal()
>>
>> En TFormBuscaArticulos todas las variables de TFormFacturaClientes seran
>> ::oParent:Nombre del objeto:Value ó Texto
>>
>> Ej
>>
>> ** Si el Browse contiene registros
>> IF ::oParent:oDBBCarreras:KeyCount() > 0
>> *
>> ::oNUMCONC:Value := ::oParent:oDbfCarreras:RACE_ID
>> ::oNUMSUELTA:Value := ::oParent:oDbfCarreras:N_CARRERA
>> ::oFECHAHORA:Value :=
>> SubStr(::oParent:oDbfCarreras:F_SUELTA,7,2)+"/"+;
>>
>> SubStr(::oParent:oDbfCarreras:F_SUELTA,5,2)+"/"+;
>>
>> SubStr(::oParent:oDbfCarreras:F_SUELTA,1,4)+" "+;
>>
>> SubStr(::oParent:oDbfCarreras:F_SUELTA,9,2)+":"+;
>>
>> SubStr(::oParent:oDbfCarreras:F_SUELTA,11,2)+":"+;
>> SubStr(::oParent:oDbfCarreras:F_SUELTA,13,2)
>> ::oLUGAR:Value := ::oParent:oDbfCarreras:POBLACION
>> *
>> ENDIF
>>
>> José Ramón Castro.
>>
>> Juan Castañeda escribió:
>>> José.
>>>
>>> Como le asigno a oParent el objeto ventana padre.
>>>
>>> Ej
>>>
>>> METHOD DbfBrowseFacturaColumn2BtnClick( oSender, Value ) CLASS
>>> TFormFacturaClientes
>>> TFormBuscaArticulos():New(Self)
>>> TFormBuscaArticulos():oParent := ::TFormFacturaClientes
>>> TFormBuscaArticulos():ShowModal()
>>>
>>> Esto no me funciona
>>>
>>> TFORMFACTURACLIENTES:DBFBROWSEFACTURACOLUMN2BTNCLICK(463)
>>> Error BASE/1004 Message not found:
>>> TFORMFACTURACLIENTES:TFORMFACTURACLIENTES
>>> Argumentos: ()
>>>
>>> Gracias por tu respuesta.
>>>
>>>
>>> "Jose F. Gimenez" <
jfgimenez@wanadoo.es> escribió en el mensaje
>>> news:491c31e5$[email=
1@ozsrv2.ozlan.local...]
1@ozsrv2.ozlan.local...[/email]
>>>> Juan,
>>>>
>>>>> Cuando llamo a una ventana con ShowModal dentro de otra que ya era
>>>>> modal me aparece la ventana del editor de xailer y el programa en
>>>>> ejecucion. Pero no la ventana que acabo de abrir...!!
>>>> Revisa bien el 'oParent' de cada ventana. La primera modal tiene que
>>>> tener como 'padre' la ventana principal del programa, pero la segunda
>>>> modal tiene que tener como 'padre' la primera modal, y así sucesivamente
>>>> todas las modales. Como ves, es importantísimo indicar siempre cual es
>>>> el padre de una ventana.
>>>>
>>>> --
>>>> Un saludo,
>>>>
>>>> José F. Giménez
>>>>
http://www.xailer.com
>>>>
http://www.xailer.info
>>>>
>