In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Modificar una clase

Foro público de Xailer en español
Responder
perolero
Mensajes: 135
Registrado: Mar Dic 21, 2010 9:54 am

Modificar una clase

Mensaje por perolero »

Hola:
Estoy haciendo mis primeros intentos para modificar una clase (XEdit)para lo cual he creado una clase llamada TEdit que hereda de XEdit, y en plan pedagógico en modificado el comportamiento de la propiedad (QUE YA EXISTE) nClrPaneFocus a un determinado color para que cada vez que un Edit coja el foco se pinte su Pane de dicho color, hasta aquí­ perfecto.
Ahora quiero CREAR una propiedad nueva que sea capaz de darme la longuitud de dicho edit, usando los READ y WRITE
#include "Xailer.ch"
CLASS TEdit FROM XEdit


PUBLISHED:
PROPERTY nClrPaneFocus INIT 0x80FFFF
PROPERTY nLength INIT 0 READ METHOD GetLength WRITE METHOD SetLength

PUBLIC:
METHOD GetLength()
METHOD SetLength()

ENDCLASS
//---------------------------------------------------------- --------------------
METHOD SetLength() CLASS TEdit
Local n := 0
for n := 1 to len(self:Value)

next
Return
//---------------------------------------------------------- --------------------
METHOD GetLength() CLASS Tedit
Return
Dejo los métodos sin valores de retorno, para ver si alguien me puede decir que habrí­a que poner en ellos para qye la propiedad nLength CREADA escribiera y leyera el valor de la variable 'n'.
Anticipadamente gracias.
Emilio Gil.
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Modificar una clase

Mensaje por jlalin »

Emilio,
no estoy seguro de lo que quieres hacer pero prueba así­:
CLASS TEdit FROM XEdit
PUBLISHED:
PROPERTY nLength INIT 0 WRITE METHOD SetLength
PUBLIC:
METHOD SetLength()
ENDCLASS
//---------------------------------------------------------- --------------------
METHOD SetLength( Value ) CLASS TEdit
::FnLength := Value
RETURN Nil
//---------------------------------------------------------- --------------------
El método GetLength() no lo necesitas, la propiedad nLength te devolverá el
valor que ya tiene asignado.
Saludos,
José Lalí­n
perolero
Mensajes: 135
Registrado: Mar Dic 21, 2010 9:54 am

Modificar una clase

Mensaje por perolero »

Hola Lalí­n:
Pruebo de esta forma:
CLASS TEdit FROM XEdit
PUBLISHED:
PROPERTY nLength INIT 0 WRITE METHOD SetLength
PUBLIC:
METHOD SetLength(value)
ENDCLASS
//---------------------------------------------------------- --------------------
METHOD SetLength(Value) CLASS TEdit
::FnLength := value
Return Nil
Notese que al método le paso el vaor 'value' de lo contrario me da error Compilando Tedit.prg...
Tedit.prg(28) Warning W0001 Ambiguous reference: 'VALUE'
Enlazando Perol.exe...
1 Files, 1 Warnings, 0 Errors
Tiempo de compilación: 0.50s Tiempo de enlazado: 0.53s Tiempo total: 1.11s
y me devuelve siempre el valor cero, el que he definido como INIT en la propiedad
supongase que yo quiero devolver en valor 50, que tendrí­a que hacer para que esto sucediese.
Muchas gracias,
Em,ilio Gil.
perolero
Mensajes: 135
Registrado: Mar Dic 21, 2010 9:54 am

Modificar una clase

Mensaje por perolero »

Yo mismo me respondo:
Si quiero devolver por ejemplo el valor 50, hago lo siguiente, por lo que si me hace falta el método GetLength
CLASS TEdit FROM XEdit
PUBLISHED:
PROPERTY nLength INIT 0 READ METHOD GetLength WRITE METHOD SetLength
PUBLIC:
METHOD SetLength(value) // el metodo set debe de incluir el valor 'value'
METHOD GetLength()

ENDCLASS
//---------------------------------------------------------- --------------------
METHOD SetLength(value) CLASS TEdit
::FnLength := value //aquí­ siempre lo mismo
Return Nil
//---------------------------------------------------------- --------------------
METHOD GetLength() CLASS TEdit
// en el return lo que devuelve para asignar a la propiedad
return 50
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Modificar una clase

Mensaje por jlalin »

Emilio,
> METHOD GetLength() CLASS TEdit
> // en el return lo que devuelve para asignar a la propiedad
> return 50
ten en cuenta que si lo haces así­, siempre devolverá 50 aunque asignes otro
valora nLength.
Si es indispensable el método:
METHOD GetLength() CLASS TEdit
RETURN ::FnLength
Saludos,
José Lalí­n
perolero
Mensajes: 135
Registrado: Mar Dic 21, 2010 9:54 am

Modificar una clase

Mensaje por perolero »

Gracias Lalí­n.
Saludos,
Emilio Gil.
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Modificar una clase

Mensaje por jfgimenez »

Emilio,
las cláusulas WRITE [ METHOD | INLINE ] y READ [ METHOD | INLINE ] sirven
para manipular la forma de asignar y leer respectivamente el valor de una
propiedad. En la ayuda de Xailer ("Jerarquí­a de Clases", "Programación
orientada a objectos", "Las propiedades") tienes una explicación bastante
completa de cómo funcionan. No obstante, te lo resumo en pocas lí­neas:
- El método WRITE recibe siempre un parámetro, que es el valor a asignar a
la propiedad. Si se utiliza la variante INLINE, este parámetro se llamará
<Value>, pero con la variante METHOD lo puedes llamar como quieras. Tiene
que retornar *siempre* el valor que queda en la propiedad.
- Si no está presente la cláusula WRITE, se utilizará un método por defecto,
que consiste simplemente en asignar el valor de la propiedad. P.ej.:
PROPERTY nLength WRITE INLINE ::FnLength := Value
- El método READ no recibe ningún parámetro, pero tiene que retornar
*siempre* el valor de la propiedad.
- Si no está presente la cláusula READ, se utilizará un método por defecto
que consiste simplemente en retornar el valor de la propiedad. P.ej.:
PROPERTY nLength READ INLINE ::FnLength
- El valor interno de la propiedad, es una DATA cuyo nombre es exactamente
el mismo de la propiedad pero con una F delante. P.ej, para la propiedad
'nLength', su valor es 'FnLength'
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
perolero
Mensajes: 135
Registrado: Mar Dic 21, 2010 9:54 am

Modificar una clase

Mensaje por perolero »

Hola José:
Muchas gracias por tu aclaración, queda perfectamente entendido, lo que me tení­a un poco perdido es la data F????? que no encontraba por ningún lado su declaración, sólo veí­a que en los controles aparecí­an muchas datas que comenzaban por F pero que no se declaraban en ningún lugar, pero vista la documentación queda el tema resuelto.
Un saludo,
Emilio Gil.
Responder