Página 1 de 1

Modificar una clase

Publicado: Mié May 18, 2011 1:39 pm
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.

Modificar una clase

Publicado: Mié May 18, 2011 2:06 pm
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

Modificar una clase

Publicado: Mié May 18, 2011 3:29 pm
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.

Modificar una clase

Publicado: Mié May 18, 2011 3:53 pm
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

Modificar una clase

Publicado: Mié May 18, 2011 5:18 pm
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

Modificar una clase

Publicado: Mié May 18, 2011 6:26 pm
por perolero
Gracias Lalí­n.
Saludos,
Emilio Gil.

Modificar una clase

Publicado: Mié May 18, 2011 7:43 pm
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

Modificar una clase

Publicado: Jue May 19, 2011 11:53 am
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.