sábado, 30 de julio de 2011

6. Creando el componente/clase “convertirnumeroaletra”

Ahora vamos a crear una nueva componente/clase que no tenga heredado nada de otro componente (ni propiedades ni eventos ni métodos).

Nuestro objetivo es crear una nueva clase que haga que un número (dado en cifras) convertirlo en letras, y con la opción de poner la moneda.

Por ejemplo, que si tenemos una propiedad llamada .value=2030,30, tengamos también una función que nos devuelva “dos mil treinta euros con treinta céntimos”.

Como hicimos con el ejemplo de “supergridviews”, crearemos el programa como componente, autaticamente se nos crear varios archivos, que modificaremos (borramos, añadiremos un icono, etc, tal como se hizo en la explicación anterior).

Llegaremos a esta pantalla:


Se ha creado una nueva clase llamada numeroaletra y un icono referente a lo que realiza esta función tema de la función.

Empezamos con el código de la clase numeroaletra:

' Gambas class file
'orden necesaria para que sea un compone
EXPORT

'definimos varias variables
PROPERTY valor AS Float ' es el numero que introduciremos
PRIVATE hvalor AS Float
PROPERTY enletra AS String 'es el número en letras
PRIVATE henletra AS String
PROPERTY moneda AS String ' es la moneda que añadira a la parte entera del número
PRIVATE hmoneda AS String
PROPERTY centimo AS String ' es el centimo que añadira a la parte decimal del numero
PRIVATE hcentimo AS String

'definimos la propiedades que tendra en el cuadro de propiedades
PUBLIC CONST _Properties AS String = "valor,moneda,centimo,enletra"

PRIVATE FUNCTION valor_Read() AS Float
RETURN hvalor
END

PRIVATE SUB valor_Write(Value AS Float)
hvalor = value
END


PRIVATE FUNCTION enletra_Read() AS String
RETURN henletra
END

PRIVATE SUB enletra_Write(Value AS String)
henletra = Value '
END

PRIVATE FUNCTION moneda_Read() AS String
RETURN hmoneda
END

PRIVATE SUB moneda_Write(Value AS String)
hmoneda = Value
END

PRIVATE FUNCTION centimo_Read() AS String
RETURN hcentimo
END

PRIVATE SUB centimo_Write(Value AS String)
hcentimo = Value
END

'esta es la funcion que aparecerá que nuestro IDE
PUBLIC SUB convertiraletra()
henletra = ConvierteNumero_a_letras(hvalor, hmoneda, hcentimo)
END

'esta función es privada, osea no nos aparece en el IDE de programación
PRIVATE FUNCTION ConvierteNumero_a_letras(valor AS Float, moneda AS String, centimo AS String) AS String
DIM i AS Float
DIM r AS Float
DIM hastacoma AS String
DIM texto AS String
DIM monedaPlural AS String
DIM mCentPlural AS String
DIM mcent AS String
moneda = Upper$(moneda)
mcent = Upper$(mcent)
monedaPlural = palabraPlural(moneda)
mCentPlural = palabraPlural(centimo)
i = Int(valor)
r = (valor - i) * 100
IF i = 0 THEN
IF r = 1 THEN
RETURN Num2Text(r) & " " & mCent & " "
ENDIF
IF r > 1 THEN
RETURN Num2Text(r) & " " & mCentPlural & " "
ENDIF
ELSE
IF r = 0 THEN
IF i = 1 THEN
RETURN Num2Text(i) & " " & moneda
ENDIF
IF i > 1 THEN
RETURN Num2Text(i) & " " & monedaPlural
ENDIF
ELSE
r = Round(r, -1) 'para tener números exactos redondeo los decimales en caso que el valor venga con más de 2 decimales.
r = Int(r)
IF i = 1 THEN
IF r = 1 THEN RETURN Num2Text(i) & " " & moneda & " CON " & Num2Text(r) & " " & mCent
IF r > 1 THEN RETURN Num2Text(i) & " " & moneda & " CON " & Num2Text(r) & " " & mCentPlural
ELSE
IF r = 1 THEN RETURN Num2Text(i) & " " & monedaPlural & " CON " & Num2Text(r) & " " & mCent
IF r > 1 THEN RETURN Num2Text(i) & " " & monedaPlural & " CON " & Num2Text(r) & " " & mCentPlural
ENDIF
ENDIF
ENDIF
END
'--------------------------------
'poner plurales en castellano
'--------------------------------
'tambien es una función privada
PRIVATE FUNCTION palabraPlural(texto AS String) AS String
DIM vocal AS String
DIM ultimaLetra AS String
IF texto = "" THEN RETURN “ “
vocal = "AEIOU"
ultimaLetra = Right(texto, 1)
IF (InStr(vocal, ultimaLetra)) THEN
RETURN texto & "S"
ELSE
RETURN texto & "ES"
ENDIF
END
'--------------------------------
'escribir el numero
'--------------------------------
'tambien es una función privada
PRIVATE FUNCTION Num2Text(value AS Long) AS String
DIM texto AS String
IF value = 0 THEN RETURN "CERO"
IF value = 1 THEN RETURN "UN"
IF value = 2 THEN RETURN "DOS"
IF value = 3 THEN RETURN "TRES"
IF value = 4 THEN RETURN "CUATRO"
IF value = 5 THEN RETURN "CINCO"
IF value = 6 THEN RETURN "SEIS"
IF value = 7 THEN RETURN "SIETE"
IF value = 8 THEN RETURN "OCHO"
IF value = 9 THEN RETURN "NUEVE"
IF value = 10 THEN RETURN "DIEZ"
IF value = 11 THEN RETURN "ONCE"
IF value = 12 THEN RETURN "DOCE"
IF value = 13 THEN RETURN "TRECE"
IF value = 14 THEN RETURN "CATORCE"
IF value = 15 THEN RETURN "QUINCE"
IF value >= 16 AND value < 20 THEN
texto = "DIECI" & Num2Text(value - 10)
RETURN texto
ENDIF

IF value = 20 THEN RETURN "VEINTE"
IF value >= 21 AND value <= 29 THEN
texto = "VEINTI" & Num2Text(value - 20)
RETURN texto
ENDIF
IF value = 30 THEN RETURN "TREINTA"
IF value = 40 THEN RETURN "CUARENTA"
IF value = 50 THEN RETURN "CINCUENTA"
IF value = 60 THEN RETURN "SESENTA"
IF value = 70 THEN RETURN "SETENTA"
IF value = 80 THEN RETURN "OCHENTA"
IF value = 90 THEN RETURN "NOVENTA"
IF value < 100 THEN
texto = Num2Text(Int(value / 10) * 10) & " Y " & Num2Text(value MOD 10)
RETURN texto
ENDIF
IF value = 100 THEN RETURN "CIEN"
IF value < 200 THEN
texto = "CIENTO " & Num2Text(value - 100)
RETURN texto
ENDIF

IF value = 200 OR value = 300 OR value = 400 OR value = 600 OR value = 800 THEN
texto = Num2Text(Int(value / 100)) & "CIENTOS"
RETURN texto
ENDIF

IF value = 500 THEN RETURN "QUINIENTOS"
IF value = 700 THEN RETURN "SETECIENTOS"
IF value = 900 THEN RETURN "NOVECIENTOS"

IF value < 1000 THEN
texto = Num2Text(Int(value / 100) * 100) & " " & Num2Text(value MOD 100)
RETURN texto
ENDIF

IF value = 1000 THEN
RETURN "MIL"
ENDIF

IF value < 2000 THEN
Texto = "MIL " & Num2Text(value MOD 1000)
RETURN texto
ENDIF

IF value < 1000000 THEN
texto = Num2Text(Int(value / 1000)) & " MIL"
IF (value MOD 1000) THEN texto = texto & " " & Num2Text(value MOD 1000)
RETURN texto
ENDIF

IF value = 1000000 THEN texto = "UN MILLON"

IF value < 2000000 THEN
Texto = "UN MILLON " & Num2Text(value MOD 1000000)
RETURN texto
ENDIF

IF value < 1000000000000.0 THEN
texto = Num2Text(Int(value / 1000000)) & " MILLONES "
IF (value - Int(value / 1000000) * 1000000) THEN Texto = Texto & " " & Num2Text(value - Int(value / 1000000) * 1000000)
RETURN texto
ENDIF

IF value = 1000000000000.0 THEN RETURN "UN BILLON"
IF value >= 2000000000000 THEN
Texto = "numero demasiado grande"
RETURN texto
ENDIF

END FUNCTION

Como podéis comprobar el código no ha sufrido grandes cambios con respecto a si lo hubiésemos hecho como un módulo normal, salvo la definición de variables.

Ahora nos tocaría darle al proyecto la propiedades (Proyecto/Propiedades), pestañas:

Proyecto/Propiedades/Pestaña Opciones











Proyecto/Propiedades/Pestaña Provee: aquí por un tema más de estilistico, (quiero que aparezca un icono en la pantalla de controles), le digo que es de tipo “Control” y Grupo “Control”, se podría haber dejado con el tipo “Clase”




Proyecto/Propiedades/Pestaña Requiere:



aquí como no necesitamos ningun tipo de caracteristicas ni componente lo dejamos todo igual.

Ahora pasamos a crear el ejecutable, de igual modo que hicimos con el “supergridviews”, marcamos las opciones en el menu Proyecto/Crear/ Ejecutable


Y ya lo tenemos, nuestro nuevo control/clase.

No hay comentarios:

Publicar un comentario