Página 1 de 1

Parámetros entre diálogos mediante DATAs

Publicado: Dom Dic 12, 2004 11:33 pm
por Jaime Irurzun
Hola,
A ver si alguien me puede decir por qué me ocurre lo siguiente:
Tengo un diálogo con un Tree en la clase TMainForm. Además, uso una
clase TEditar, que muestra un formulario con un GET en el que se puede
editar el nombre de un item del Tree. La idea es que mediante un botón
del formulario principal se muestre el diálogo TEditar con el nombre del
item seleccionado como ::Value del GET, para que así­ el usuario lo
modifique y tras pulsar "Aceptar" el valor se cambie en el Tree.
En el evento OnClick del botón "Editar" hago esto:
METHOD BtnEditarClick( oSender ) CLASS TMainForm
WITH OBJECT TEditar():New( Self )
:xItem := ::oTree:GetSelectedItem():cText
:ShowModal()
END
RETURN Nil
Y en el evento OnInitialize del form TEditar hago esto otro:
METHOD FormInitialize( oSender ) CLASS TEditar
::oEdtItem:Value := ::xItem
RETURN Nil
He declarado xItem como una DATA de la clase TEditar. Sin embargo, el
formulario se carga con el valor NIL en el GET. ¿Por qué puede ser?
Sé que esto lo puedo hacer sin la DATA, accediendo desde TEditar al
TMainForm así­:
Application:oMainForm:oTree:GetSelectedItem():cText
Pero me gustarí­a probarlo con la DATA y no entiendo por qué no funciona.
Gracias!
--
Un saludo,
Jaime Irurzun.
www.codigoescrito.com

Parámetros entre diálogos mediante DATAs

Publicado: Lun Dic 13, 2004 12:16 am
por jfgimenez
Jaime,
el problema es que el evento OnInitialize del formulario TEditar se ejecuta
antes de terminar el método New(). Por eso xItem todavía no tiene ningún
valor; se está asignando después.
Lo que quieres hacer, yo lo haría así:
METHOD BtnEditarClick( oSender ) CLASS TMainForm
WITH OBJECT TEditar():New( Self )
:oEdtItem:Value := ::oTree:GetSelectedItem():cText
:ShowModal()
END
RETURN Nil
Y no te haría falta escribir el evento OnInitialize de TEditar.
--
Un saludo,
José F. Giménez

Parámetros entre diálogos mediante DATAs

Publicado: Lun Dic 13, 2004 12:35 am
por Jaime Irurzun
José,
Estupendo. Yo pensaba que no podrí­a hacer eso porque el :oEdtItem no
estarí­a creado antes de que yo hiciera el :ShowModal(). Así­ hasta me
ahorro la DATA... genial, esto abre cantidad de posibilidades. Muchas
gracias.
P.D: En cualquier caso, por estilo, ¿qué forma serí­a más elegante? ¿La
que tú propones o acceder desde TEditar al Application:oMainForm? Creo
que la que tú propones... pero me gustarí­a asegurarme.
--
Un saludo,
Jaime Irurzun.
www.codigoescrito.com
José F. Giménez escribió:
> Jaime,
>
> el problema es que el evento OnInitialize del formulario TEditar se ejecuta
> antes de terminar el método New(). Por eso xItem todaví­a no tiene ningún
> valor; se está asignando después.
>
> Lo que quieres hacer, yo lo harí­a así­:
>
> METHOD BtnEditarClick( oSender ) CLASS TMainForm
>
> WITH OBJECT TEditar():New( Self )
> :oEdtItem:Value := ::oTree:GetSelectedItem():cText
> :ShowModal()
> END
>
> RETURN Nil
>
> Y no te harí­a falta escribir el evento OnInitialize de TEditar.
>

Parámetros entre diálogos mediante DATAs

Publicado: Lun Dic 13, 2004 12:50 am
por jfgimenez
Jaime,
> P.D: En cualquier caso, por estilo, ¿qué forma sería más elegante? ¿La que
> tú propones o acceder desde TEditar al Application:oMainForm? Creo que la
> que tú propones... pero me gustaría asegurarme.
En mi opinión, no sólo es más elegante, sino que también resulta más legible
el código de la forma que te he propuesto. De todos modos, creo que es
cuestión del estilo particular de cada uno.
--
Un saludo,
José F. Giménez

Parámetros entre diálogos mediante DATAs

Publicado: Lun Dic 13, 2004 7:42 pm
por jlalin
Jaime,
si no necesitas mostrar un diálogo o quieras ahorrarte el hacerlo
también puedes hacerlo de este modo:
* Establece la propiedad lEditLabels a .T.
* Llama a ::oTree:EditLabel( ::oTree:GetSelectedItem():hItem )
* Si quieres redondearlo, dale al usuario la posibilidad de hacerlo con
una tecla estándar como F2.
Saludos,
José Lalí­n

Parámetros entre diálogos mediante DATAs

Publicado: Lun Dic 13, 2004 7:55 pm
por Jaime Irurzun
José,
Así­ mucho mejor. De hecho es lo que quise hacer desde un principio pero
no encontraba la forma. Muchas gracias!
--
Un saludo,
Jaime Irurzun.
www.codigoescrito.com
José Lalí­n escribió:
>
> Jaime,
>
> si no necesitas mostrar un diálogo o quieras ahorrarte el hacerlo
> también puedes hacerlo de este modo:
>
> * Establece la propiedad lEditLabels a .T.
> * Llama a ::oTree:EditLabel( ::oTree:GetSelectedItem():hItem )
> * Si quieres redondearlo, dale al usuario la posibilidad de hacerlo con
> una tecla estándar como F2.
>
> Saludos,
> José Lalí­n