Consultas, desarrollo de programas y petición de presupuestos:

domingo, 28 de agosto de 2011

Componente gb.odt: 2º versión

Ya esta aquí la 2º versión de este control, ampliamente mejorado en lo referido a los formatos y tipos de letras que se reconocen.







 Enlaces de descarga:
Paquete código fuente:
https://app.box.com/s/5kjcnmqolh3jic9s8o3z (actualizado enlace 27/05/2014)

http://manualjsb.googlecode.com/files/odt-0.2.0.tar.gz


Ayuda sobre el componente:
http://manualjsb.googlecode.com/files/manual%20del%20uso%20del%20componenete%20gbgbt%20020.odt%20.odt

Paquete .deb

http://manualjsb.googlecode.com/files/gambas2-odt_0.2-1_all.deb

Código fuente de un programa de ejemplo:
http://manualjsb.googlecode.com/files/pruebaodt-0.2.tar.gz

Saludos

Juguemos al BingoGambas con Gambas2

Bingo-Gambas


Es un programa para simular el juego de Bingo, genera la salida de  los números aleatorios (de 1 a 75), y los señala en la pantalla.



En el aspecto sobre la programación de este programa, os comento:

Es fácilmente ampliable para más (o menos) números, al utilizar array de label para dibujar y hacer cambios en el cartón de la pantalla.
Módulo "var" donde se encuentras las variables globales:

' Gambas module file
PUBLIC num_max AS Integer = 75
PUBLIC num_sinsalir AS Integer = 75
PUBLIC incx AS Integer
PUBLIC incy AS Integer
PUBLIC fichas AS NEW Object[] ' var.num_max]
PUBLIC ficha_temp AS Object
PUBLIC texto AS String



Módulo "carton":

' Gambas module file

PUBLIC SUB rellenacarton()
DIM a AS Integer
var.incx = -47 + 4
var.incy = 70
FOR a = 0 TO var.num_max - 1
var.ficha_temp = NEW Textlabel(FormCarton)
var.incx = var.incx + 47
IF var.incx > 670 THEN
var.incy = var.incy + 47
var.incx = 4
ENDIF
var.ficha_temp.x = var.incx
var.ficha_temp.y = var.incy
var.ficha_temp.Background = &H5FAFFF&
var.ficha_temp.Alignment = 3
var.ficha_temp.border = 3
var.ficha_temp.height = 42
var.ficha_temp.width = 42
var.ficha_temp.text = Str(a + 1)
var.fichas.Add(var.ficha_temp)
NEXT
END
 

 Y  acceder a ellos para cambiar el color del fondo es también muy sencillo. Módulo "sacar"
 
…..
'pongo la el numero de la ficha en fondo rojo....
var.fichas[numero - 1].Background = &HFF3D5D&
…..


El sistema de elegir el "número" aleatorio, es similar al que utilice en el programa "Refranero":
- Se crea una lista con todos los números.
- Luego elegimos aleatoriamente la posición,
- sacamos el numero elegido de la lista
-  y recostruimos la lista con un elemento menos.

Todo este proceso se realiza con ayuda del archivo "bolas.txt", que es el que tiene la lista de los números que aun no han salido.
 
….
posicion = Rnd(0, var.num_sinsalir)
'una cosa es el numero y otra es la posicion de la lista...
'abre el archivo que contiene las bolas
cadena = lista.leer()
bolas_txt = Split(cadena, "|")
'crear un nuevo array con los datos
FOR a = 0 TO bolas_txt.count - 2
bolas[a] = CInteger(bolas_txt[a])
NEXT
' coge el que ocupa la posicion
numero = bolas[posicion]
'crea una nuevo array sin esa posicion
c = -1
FOR a = 0 TO bolas_txt.count - 2
IF a <> posicion THEN
c += 1
bolas_reformada[c] = bolas[a]
ENDIF
NEXT
'lo guarda
cadena = ""
FOR a = 0 TO bolas_reformada.Count - 1
cadena &= Str$(bolas_reformada[a]) & "|"
NEXT
File.Save(User.home & "/bolas.txt", cadena)
….


 También he añadido la opción de decir en voz el número que sale escogido, usando el comando speak. Módulo "hablar"

' Gambas module file

PUBLIC SUB di(texto AS String)
EXEC ["aoss", "espeak", "-ves", "-s 120", texto] 
END

Aquí tenéis una captura de la pantalla del IDE, donde podéis ver los módulos que forman el programa.


Aquí teneís el enlace de descarga del código fuente

GambasChat: Comunicacion entre dos ordenadores

GambasChat
Comunicación entre dos ordenadores

Esta es una pequeña aplicación, basada en la aplicación de marito72 (enlace), donde se trata de la comunicación entre ordenadores (en esta versión funciona con dos ordenadores en una red local (intranet)). Es un ejemplo de uso de   socket y TCP cliente-servidor.

Aqui teneis fotos del ordenador "servidor":

Y del ordenador "cliente":
Estos son los formularios:
El del servidor:
El del cliente:

Os dejo un video para ver su uso:



Descarga de ficheros:

servidor: GambasChatservidor-0.0.12.tar.gz

cliente: GambasChatcliente-0.0.15.tar.gz

componente necesario: supergridviews.133

Encriptación en Gambas: El componente gb.crypt

GB.CRYPT

En gambas tenemos un componente, el gb.crypt, que nos puede facilitar tanto la encriptación como la comprobación  de claves, para permitir el acceso o no de usuario a distintas informaciones.


He hecho esta pequeña aplicación donde vemos como se usa este componente:

Este es el código:

' Gambas class file

PUBLIC SUB ButtonEncriptar_Click()
labelEncriptar.Caption = Crypt.MD5(textboxEncriptar.text)
END

PUBLIC SUB ButtonDesencrip_Click()
IF Crypt.Check(TextBoxDesincriptar.text, labelEncriptar.caption) = FALSE THEN
LabelDesencriptado.caption = "ok contraseña comprobada"
ELSE
LabelDesencriptado.caption = "Error en contraseña"
ENDIF
END

Como veis, al pulsar en el Boton Encriptar, creamos la clave con el valor contenido en el textoboxEncriptar.txt, (con la funcion Crypt.MD5), y lo almacenamos en el labelEcriptar.caption

Luego para desencriptar:
          introducimos nuestra "contraseña a comprobar" en el textboxDesincriptar.text
           y pulsamos el boton ButtonDesencrip, haciendo la comprobación, con el método Crypt.Check (valor_introducido, valor guardado anteriormente), que devuelve FALSE cuando es correcta la contraseña, y TRUE cuando no lo es.

Aquí tenéis el código fuente.


Nota:
- Documentación: http://gambasdoc.org/help/comp/gb.crypt/crypt?es
-Para poder usar este componente, hay que seleccionarlo en la pantalla:
Proyecto/Propiedades/Componentes

Varios juegos en Gambas: Tetris

n amigo, me ha pasado un código fuente de un juego de tetris. En el código me he dado cuenta de que viene el autor Carlo Cominotti y su pagina web  http://comisat-games.sf.net. y me he llevado una gran sorpresa al encontrar en dicha página web varios juegos realizados en gambas, pero para la version 1.0, con lo cual habría que revisarlos para que funcionen bien en la versión actual de gambas2 (os dejo el codigo fuente de varios juegos, pero dan algunos errores y habrá que revisar su código...)

También, os dejo el codigo fuente del Tetris (que funciona perfectamente en gambas2). Nota los comentarios del codigo fuente están en italiano.


Ide para Java usando Gambas y Gedit

Os presento una nueva utilidad realizada en este lenguaje Gambas2, para crear, editar, compilar y ejecutar applets de JAVA.


Es una aplicación que usa Gedit, para crear y editar los archivos (aprovechado el coloreado de código automático que realiza), siguiendo los consejos de Soplo  (del foro gambas-es.org) de no inventar la rueda cuando ya esta inventada.

Podemos compilar usando un botón (que llama al compilador javac) y ejecutar el applet generado.

Aprovecha la potencia del sistema operativo Gnu/Linux, usando la orden shell de Gambas, llamando a distintas aplicaciones (gedit, javac, tar, etc), y utilizando las capacidades del multitarea para realizar estos procesos en 2º plano, y sin quedar bloqueado el Ide principal realizado en Gambas.

Ademas se ha realizado una ayuda, en .html, siguiendo el tutorial que se expone en Introduccion a HTML realizado por Antonio Berciano Alonso.


Espero que os resulte útil este programa.

Nota:
Para realizar la descarga del programa tendreis que ver 10 anuncios, y pulsar en la esquina superior derecha en el boton Skip This Ap>

Gracias por vuestra paciencia.

Nota: Correpciones de bug
06/04/2010: El redireccionamiento de errores "2>>", se ha cambiado a "2>" ya que de la otra manera iba acumulando (añadia el archivos), los distintos errores de cada edicion. De la manera "2>", solo nos muestra los errores que se producen con el programa actual (no se veran los listadados de  errores anteriores)

09/04/2010: Mejora introducida al usar el control FileChooser para elegir el archivo a editar. (evito usar la clase Dialog que usa a la vez Nautilus). 

Gambas: nueva clase MultiInput

 
 MultiInput

Una nueva clase para  facilitar la introducción de datos en Gambas2





En gambas existe la clase InputBox, con la cual podemos obtener fácilmente del usuario una cadena para asignarla posteriormente a una variable. Un ejemplo:

 Asi, obtenemos el valor de "edad".


Pues bien, he desarrollado una nueva clase , para poder trabajar con mas asignaciones, obteniendo un formulario  como este:

Para poderlo usar en vuestros programas, os paso el código fuente,del cual tendreis que:
- Descomprimirlo y abrirlo con Gambas2.
- Crear el ejecutable (Proyecto/Crear/Ejecutable).
- Os creara un nuevo control personalizado que lo podréis incluir en vuestros proyectos (Proyecto/Propiedades/Componentes/Componentes del usuario)

Os explico a continuación el uso de la nueva clase:

Propiedad/Método Nombre Definición
Atributo titulo Define el titulo del formulario.
Método add Añade una variable,texto de presentación, y opcionalmente valor inicial
Método mostrar Muestra el formulario para rellenar los datos.
Nota: El botón cancelar hara que los valores no se guarden y se muestre “N/A”
Método devuelve Devuelve una cadena de texto del valor de la variable que le hayamos indicado.


Os paso también un ejemplo del uso de la nueva clase.
Esta es la transcripcion del código del ejemplo:

PUBLIC SUB Form_Open()
DIM mu AS NEW MultiInput
mu.titulo = "hola esto es una prueba"
mu.add("nombre1", "nombre usuario:", "ninguno")
mu.add("apellidos1", "primer apellido:", "")
mu.add("apellidos2", "segundo apellido:", "")
mu.add("direccion", "direccion de vivienda:")
mu.mostrar()
TextArea1.Text = mu.devuelve("nombre1") & "\n"
TextArea1.Text &= mu.devuelve("apellidos1") & "\n"
TextArea1.Text &= mu.devuelve("apellidos2") & "\n"
TextArea1.Text &= mu.devuelve("direccion") & "\n"
TextArea1.Text &= "Ahora probamos con una variable que no existe:" & "\n"
TextArea1.Text &= mu.devuelve("dksl") & "\n"
END


Como veis lo primero que hacemos es crear nuestra nueva instancia "mu" del MultiInput.

Luego le voy pasando el titulo del formulario
mu.titulo

Y voy añadiendo variables, primero el nombre, luego el texto de la etiqueta texto que pondra, y el valor por defecto.
mu.add({nombre_variable},{texto de la etiqueta},{valor opcionar})

Luego llamamos al formulario con:
mu.mostrar()

Y para obtener los valores, usamos el método devuelve indicandole el nombre de la variable
mu.devuelve({nombre_variable})

En esta página podéis ver como lo hice:
http://componentesgambas2.blogspot.com/p/multiinput.html

Bueno, espero que os sea util.

Saludos


Aplicación: Pseudocodigo a lenguaje C


Bueno esta es una aplicación que se me ha ocurrido hacer en unas de las clases del  curso de  Fpo de Programador de Sistema.

Se trata de hacer un programa que traduzca el  Pseudocódigo  a C, lo compile y cree el ejecutable.

Os pongo unos pantallazos y un ejemplo:




Os dejo un video de como se realiza un programa....




Y el enlace al código fuente: Enlace a Box

Gambas2: Implementacion de FIFO y LiFO

ola amigos, hoy hemos estado viendo en el curso de Analista Funcional un ejercicio de Java, sobre implementar FIFO y LIFO:


Según la wiki: http://es.wikipedia.org/wiki/FIFO_y_LIFO_%28contabilidad%29


FIFO y LIFO son métodos contables diseñados para valorar inventarios y asuntos financieros que involucran dinero que una compañía asocia con inventario de bienes producidos, materia prima, partes o componentes.

Esto es lo que me piden en el ejercicio:

Citar:
Desarrollar la implementación de una lista del tipo pila o LIFO (Last Input First Output) y de una lista del tipo cola o FIFO (First Input First Output). Las implementaciones deben ser genéricas, es decir, deben aceptar cualquier tipo de objeto.


Además, definir un tipo genérico Pila que imponga el API genérico de una lista (añadir y extraer elementos).


La clase Actividad4 tiene un método main en el que se crearán los dos tipos de lista, se les añadirá los mismos elementos y en el mismo orden. Se comprobará el orden en el que se extraen los elementos en cada lista.


En la siguiente pagina web viene la solucion para Java

https://docs.google.com/document/pub?id=1TdCH71pyhdKELmwVo4IwQnqUtVErn85KMfOaO4ZZEAk&pli=1

La ventaja de esta solución es que no usa las colecciones "prefabricadas" que ya incorpora Java, con lo cual el código puede ser implementado a  Gambas "facilmente".

Aquí podeis ver el diagrama de clases de UML, de esta solución:


Bien lo he implementado a Gambas, (gambas2: en vez de Objeto lo he implementado a Variant).

Clase ApiLista:
Código:
PUBLIC SUB anadir(Obj AS Variant)
END

PUBLIC FUNCTION extraer() AS Variant
END

PUBLIC FUNCTION getlongitud() AS Integer
END



Clase colaFifo:
Código:
' Gambas class file

INHERITS ApiLista

PRIVATE primero AS Nodo
PRIVATE ultimo AS Nodo
PRIVATE longitud AS Integer


PUBLIC SUB anadir(obj AS Variant)

DIM aux AS NEW Nodo
aux.objeto = obj
IF longitud = 0 THEN
primero = aux
ELSE
ultimo.siguiente = aux
ENDIF

ultimo = aux
longitud += 1

END


PUBLIC FUNCTION extraer() AS Variant

DIM obj AS Variant
IF longitud = 0 THEN
RETURN -111 'cola vacia
ELSE
obj = primero.objeto
primero = primero.siguiente
longitud -= 1
RETURN obj
ENDIF

END

PUBLIC FUNCTION getlongitud() AS Integer

RETURN longitud

END



Clase pilaLiFo:
Código:
' Gambas class file

INHERITS ApiLista

PRIVATE top AS Nodo
PRIVATE longitud AS Integer



PUBLIC SUB anadir(obj AS Variant)

DIM aux AS NEW Nodo
aux.objeto = obj
aux.siguiente = top
top = aux
longitud += 1

END



PUBLIC FUNCTION extraer() AS Variant
DIM obj AS Variant

IF top = NULL THEN
RETURN NULL ' lista vacia
ENDIF

obj = top.objeto
top = top.siguiente
longitud -= 1
RETURN obj


END

PUBLIC FUNCTION getlongitud() AS Integer

RETURN longitud

END




Clase Nodo:
Código:
PUBLIC objeto AS Variant
PUBLIC siguiente AS Nodo




En el Formulario FMain: (añadimos un textarea, para ver el resultado)
Código:
PUBLIC SUB Form_Open()
' obtenido de:
'https://docs.google.com/document/pub?id=1TdCH71pyhdKELmwVo4IwQnqUtVErn85KMfOaO4ZZEAk&pli=1
'java-FIFO-LIFO
DIM i AS Integer
DIM elementos AS Integer

DIM pila AS NEW pilaLiFO[]
DIM cola AS NEW colaFifo[]



' Añadimos los mismos elementos a la pila y la cola.
FOR i = 0 TO 9
pila.anadir("AB" & Str$(I))
cola.anadir("AC" & Str$(I))
NEXT

' Extraer Pila
TextArea1.text = "Orden de Extraccion de la pila LIFO:\n"


elementos = pila.getlongitud()

FOR i = 0 TO elementos - 1
TextArea1.text &= " [" & pila.extraer() & "] "
NEXT

TextArea1.text &= "\n-------\n"
'Extraer en Cola
TextArea1.text &= "Orden de Extraccion de la cola FIFO:\n"


elementos = cola.getlongitud()

FOR i = 0 TO elementos - 1
TextArea1.text &= " [" & cola.extraer() & "] "
NEXT


END

Aqui podeis ver la salida generada por el programa:


Programa para el cálculo de áreas de polígonos irregulares


He realizado una pequeña aplicación usando este algoritmo, además de implementar varias utilidades (dibujar y guardar en .bmp del polígono, copiar y pegar los datos desde el portapapeles). Aquí la tenéis:





Como siempre aquí tenéis el código fuente

Saludos

Julio Sanchez.

Nota:
Para usar la aplicación teneis que tener instalado las versiones más actuales de los componentes supergridviews, y ejescartesianos.
 enlace supergridviews
 enlace ejescartesianos

Para instalarlos, ver el vídeo dedicado a la
"instalación de componentes realizados por usuarios" en la pestaña videotutoriales de este blog.

Aquí os dejo una explicación del programa:


Gambas2: Teclado Numerico para introducir claves de acceso

Este es mi primer proyecto de programación orientada a objetos, donde he usado, clases y arrays de clases, para resolver un programa que use  un teclado virtual en pantalla.

Temas tratados:








- Clase
         - variables públicas: coordenadas de las esquenas opuestas del rectangulo
         - variables privadas de la clase
         - métodos: "dentro"

- Picture: evento mouseup

- Drawingarea:
            -fillstyle: relleno del área del rectángulo definido
            -dibujo de lineas y rectángulos
            -cargar una imagen de fondo
            -evento mouseup
- Guardar y abrir un archivo de texto plano con los datos de la imagen y rectángulos definidos (valor de tecla y valores de coordenadas)


Accesos a los videos:
001. Usando una clase: rectangulo
002. Usando un array de clases
003. Programa para definir los rectángulos y generar su código en Gambas2.






Código fuente: tecladovisual-0.0.1.tar.gz

Código fuente: tecladovisual 2 forma-0.0.1.tar.gz

Código fuente: definidor_rectangulos-0.0.1.tar.gz






Front-end: Convertidor .ogv a .avi 2º versión


Front-end: Convertidor .ogv a .avi 2º versión

La ventaja de hacer un programa que sea software libre con licencia GPL, es que cualquier persona con conocimientos y ubicada en cualquier parte del mundo, puede mejorar dicho programa, y que todo el mundo se beneficie.

Este es un caro ejemplo de ello:


A continuación os comento una nueva mejora del programa "Convertidor .ogv a .avi", ha sido realizado por razaAztk un miembro del foro gambas-es.org.
Se trata de poner una barra que indique el estado de la conversión, algo muy útil para saber cuanto tiempo le queda para terminar la conversión.



Comentaré un poco como lo ha conseguido hacer:
Ha creado un proceso de la siguiente manera:

hproc = EXEC ["mencoder", TextBoxentrada.text, "-ovc", "xvid", "-oac", "mp3lame", "-xvidencopts", "pass=1", "-o", TextBoxsalida.text] FOR READ AS "Mencorder"
Asi cada vez que proceso manda algo a la salida standard, se lanza el evento Mencorder_Read()

Y con esta subrutina,  lee  cada vez que se produce una salida en la terminal:

PUBLIC SUB Mencorder_Read()

  DIM sLine AS String
  DIM sCad AS String[]
  DIM vx AS Float

  READ #LAST, sLine, -50
  'PRINT sLine
  sLine = Trim(sLine)
  IF sLine LIKE "*[0-9]*%*" THEN
    sCad = Split(sLine, " ", "'", TRUE)
    TRY vx = Val(Replace$(Replace$(Replace$(sCad[3], "%", ""), "(", ""), ")", "")) / 100
    IF vx > 0 THEN
      pb.Value = vx
    ENDIF
  ENDIF
END  


Y va analizando la salida que genera el EXEC en la terminal (  READ #LAST, sLine, -50 ). leemos unos cuantos caracteres (en este caso 50)

Cada línea lanza el evento Read, las lineas que nos interesa para la progress bar son las del tipo:


Pos:   1.3s     22f (84%)  0.00fps Trem:   0min   0mb  A-V:0.140 [1705:7]

Asi cuando encuentra algún numero con porcentaje en la linea que esta analizando (  IF sLine LIKE "*[0-9]*%*" THEN ).

vx = Val(Replace$(Replace$(Replace$(sCad[3], "%", ""), "(", ""), ")", "")) / 100
  y tomamos el campo 4 ( sCad[3] (recordemos que los arrays empiezan por 0, por eso no es 4), que es el (84%). Quitamos los caracteres sobrantes (%) y lo pasamos a numero.
Este número lo pasa a pb.value (a la progress bar ), y asi va mostrando como se esta desarrollando el proceso.


Este código es muy útil ya que saber la salida  en la terminal que genera un comando ejecutado por la orden EXEC, puede ser fundamental para la buena ejecución de nuestro programa.

Imaginaos por ejemplo que no este instalado mencoder en nuestro ordenador, podemos avisar al usuario que tiene que "hemos detectado que mencoder no esta instalado"... algo que sin lugar a dudas nos será muy útil.

Enlaces de descarga:
http://proyectojulio.googlecode.com/files/ogvavi-0.0.2.tar.gz
http://proyectojulio.googlecode.com/files/ogvavi_0.0.2.deb

Saludos y gracias por cooperar con tus conocimientos en este proyecto razaAztk