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

Mostrando entradas con la etiqueta ayuda. Mostrar todas las entradas
Mostrando entradas con la etiqueta ayuda. Mostrar todas las entradas

lunes, 29 de agosto de 2011

Indentador / Sangrado de nuestro Código Fuente realizado en Gambas2

Actualización a Gambas3
El indentado del código en Gambas3 ya esta integrado en el Ide. Lo podeis activar en el menu: Herramientas/Preferencias/Formateo de Codigo


Este programa es para Gambas2:
El otro dia charlando con jguardon, uno de los administradores del foro gambas-es.org, estuvimos hablando sobre las diferencias entre Gambas y Python. Me comentaba que en lenguajes como Python el sangrado o indentado es fundamental ya que indican cuando termina un bucle o intrucción. Me explico que no existe, por ejemplo ENDIF, solo que se se disminuye la indentación o sangría (este es el termino correcto en castellano) para indicarle a Python que se ha terminado la instrucción IF THEN.

Una de las razones  de la "mala fama" que tiene programar en Basic, es que es considerado por los otros programadores "profesionales", que es para personas que empiezan a programar y no con fines serios. Y que al no ser necesario indentar o sangrar los programas realizados en Basic, para que funcionen, los usuarios de este lenguaje no cuidan este detalle, que es fundamental para facilitar la lectura del programa para otras personas que no han realizado e incluso para el propio autor para futuras ampliaciones , que se tiene que volver a "enterar" de como lo hizo (importantísimo también el tema de comentar el código del programa).

Bueno, para resolver este problema (que también lo tengo yo....), he realizado esta utilidad. Este pequeño programa  realiza la indentación o sangría de nuestro código fuente de un proyecto completo realizando en Gambas, archivos de .class y .module, que son los que contienen el código fuente del programa.









Ejemplo del código sin indentar:



Ejemplo del código una vez indentado:


Varios Comentarios:

1) El programa sirve para hacer el indentado o sangria, pero no detecta los errores del código fuente.
2) Hacer siempre una copia de seguridad de vuestro proyecto antes de usar este programa. Aunque lo he probado y funciona correctamente, puede producirse errores y perderse o alterarse el código fuente.
3) Vuestro programa  no tiene que estar acabado para realizar el indentado, es un proceso que lo podemos realizar mientras vamos realizando las distintas partes del código.

 Aqui teneis el enlace de descarga del código fuente:  http://manualjsb.googlecode.com/files/Indentacion-0.0.3.tar.gz



Espero que os sea útil y que vuestros programas sean "más legibles" y "más profesionales"

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

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


Usar Variables De Un Form Desde Otro

Usar Variables De Un Form Desde Otro

 Explicación de Soplo, sobre como pasar de variables de un formulario a otro:

Pongamos que al pulsar un botón quieres que se abra otro formulario form2 y allí conocer valores de dos textboxes de form1.

1º opcion
En Form2 creas la siguiente función:
private $txt1 as string, $txt2 as string
public sub _new(txt1 as string, txt2 as string)
$txt1=txt1
$txt2=txt2
end
Ahora en form1 en botón click pones lo siguiente:
private sub boton_click()
Dim F as NEW form2(textbox1, textbox2)
f.show
end
Lo que has hecho es crear una instancia en la que le pasas dos objetos existentes en form1. Esos dos objetos en este caso son dos textboxes, pero podría ser cualquier cosa. Por ejemplo yo suelo crear una única conexión a base de datos y la voy pasando a formularios según me va conviniendo).
También podrías pasarle el formulario entero. Entonces lo harías así
En form2
private $formu as form1
public sub _new(f as form1)
$formu=f
end
Y en form1 en el click del botón
public sub boton_click()
Dim F as new form2(ME)
F.show
end
Y ahora en form2 tendrías una variable conocida en todo el formulario llamada $Formu que contiene todo el formulario Form1.

2ª opción
Puedes crearte propiedades a tu gusto. Pongamos que queremos dos propiedades nombre y cif que están escritas en dos textboxes de form1 y quieres pasarlas a form2.
En form2 pones
private $txt1 as string, $txt2 as string
property nombre as string ‘al hacer esto se crearán dos funciones read y write que pondré mas abajo
property cif as string ‘al hacer esto se crearán dos funciones read y write que pondré mas abajo
Las funciones estarán vacías pero les pongo el código para que funcione
public function Nombre_read()
return $txt1
end
public sub Nombre_write(value as string)
$txt1=value
end
public function cif_read()
return $txt2
end
public function cif_write(value as string)
$txt2=value
end
A partir de ahora en form1 tu puedes hacer utilizar las propiedades que has creado
private sub boton_click
Dim F as NEW form2
f.nombre=textbox1.text
F.cif=textbox2.text
end
Otra cosa que puedes hacer (que es la peor pero funciona) es irte a las propiedades de tu proyecto y marcar la casilla los objetos de formulario son públicos. Entonces desde form2 puedes acceder a cualquier control de form1 sin nada de lo anterior.

 

Timer: ejemplo de crear un texto parpadeante y una cuenta atras

Os traigo un simple ejemplo del control timer:
un texto parpadeante y una cuenta atras
Solo necesitas 2 label, 2 RadioButton y un control Timer

Este es el codigo fuente:
‘ Gambas class file
PUBLIC a AS Integer
PUBLIC SUB Form_Open()
Timer1.Enabled = TRUE
END
PUBLIC SUB Timer1_Timer()
‘texto parpadeante
IF RadioButton1.value = TRUE THEN
Timer1.Delay = 400
IF a = 1 THEN
Label1.ForeColor = Color.red
Label1.Background = Color.Cyan
a = 0
ELSE
Label1.ForeColor = Color.blue
Label1.Background = Color.Green
a = 1
ENDIF
ELSE
‘cuenta atras
Timer1.delay = 1000
Label2.text = Str$(Val(Label2.text) – 1)
ENDIF
END
Explicacion:
Dependiendo del RadioButton que este pulsado, se activara el texto parpadeante o la cuenta atras. Y el retardo del timer, cambiara tambien a 400 milisegundos para el texto parpadeante o a 1000 milisegundos (1 seg) para la cuenta atras.
La variable “a” controla que el cambio de color.

GridViews y TableViews: Pequeña utilidad para definirlos versión 2.0

Versión mejorada del programa para definir gridviews y tableviews.
Os traigo la nueva versión de este programa, con amplias mejoras:
- colorear filas pares e impares y texto de distinto color
- añadir codigo de colorear y ordenar gridviews/tableviews (orden A-Z y Z-A)
- pedir el nombre del formulario donde este el gridviews/tableviews
- mejor visualización de la regilla resultante
- ayuda en el programa (tips, y un botón de Acerca de…)
Pulsar aqui para descargaros el codigo fuente
Pulsar aqui para descargaros el ejecutable .gambas
En fin espero que os guste esta pequeña herramienta.
Aqui os pongo un pequeño video de ejemplo de utilización del programa:



 Imagenes del programa: 




Saludos
Julio Sanchez
Nota:
8 de octubre de 2010: Gracias a Eugeny Gazzaev, me ha enviado la traducción en ruso. Ya esta incluido en los archivos de descarga.

Paso a Paso: Instalar mas tipos de letras en Ubuntu, y aplicarla en gambas2: hacer un reloj digital

Hola a todos.
Combinando la informacion de tres paginas web, vamos a:
1) Buscar nuevos tipos de letras (TTF) para nuestro linux (Ubuntu, en mi caso).
2) Instalarlas en nuestro ordenador
3) Hacer un reloj digital, con el tipo de letra que acabamos de instalar.
Nota importante: darle las gracias a los autores de las paginas a las que me voy a referir.


Pasamos a hacerlo:
1) Buscar nuevos tipos de letras:
http://fonts500.com/
Desde aqui podemos descargarnos la que mas nos guste. Por ejemplo: ALLSTAR, pulsamos sobre ella y nos saldra el cuadro de guardar: DESCARGA TIPO DE LETRA 1
La extraemos en una carpeta que crearemos nueva llamada fuentes:
00 extraer letra 2
Otras direcciones para obtener tipos de letras:
http://www.letramania.com/index.htm
http://www.fontreactor.com/
http://recursosgratis.com/fuentesgratis/
http://www.creamundo.com/
2) Instalar el nuevo tipo de letra:
En la direccion http://nideaderedes.urlansoft.com/2006/11/14/instalar-nuevos-tipos-de-letras-en-ubuntu/, nos explican como instalar tipos de letras ttf, la que nos hemos descargado es de ese tipo.
Crearemos (si no esta creado) esta carpeta font-install en /usr/share/fonts/truetype/ :

sudo mkdir -p /usr/share/fonts/truetype/font-install

Crearemos un archivo llamado “instalador”, (por ejemplo con el Editor de textos gedit), pegaremos el siguiente código:
#!/bin/bash
#
# This script helps to install fonts
#
# Set your default font storage directory here
##DEFAULT_DIR="$HOME/fonts"
DEFAULT_DIR=`pwd`
# Set the default font installation directory here
DEFAULT_DEST="/usr/share/fonts/truetype/font-install"
# Don't edit anything below unless you know what you're doing.
echo "¿En qué directorio están las fuentes?"
echo -n "[$DEFAULT_DIR] "
read DIR
echo
echo "¿Cuál es la extensión (sin el punto) de las fuentes? (ojo, no es lo mismo ttf que TTF)"
echo -n "[ttf] "
read EXT
echo
echo "¿Dónde instalo las fuentes?"
echo "¡NO CAMBIES ESTO A NO SER QUE SEPAS LO QUE HACES!"
echo -n "[$DEFAULT_DEST] "
read DEST
if [ -z "$DIR" ]; then
DIR="$DEFAULT_DIR"
fi
if [ -z "$EXT" ]; then
EXT="ttf"
fi
if [ -z "$DEST" ]; then
DEST="$DEFAULT_DEST"
fi
sudo -v
if [ $? != 0 ]; then
echo "Imposible conseguir los privilegios necesarios. Saliendo..."
echo -n "Press to continue. "
read WER
exit $?
fi
echo
echo
if [ ! -d "$DIR" ]; then
echo "El directorio $DIR no existe. Saliendo..."
echo -n "Press to continue. "
read SDF
exit 2
fi
if [ ! -d "$DEST" ]; then
echo "El directorio $DIR no existe. Saliendo..."
echo -n "Press to continue. "
read DFG
exit 1
fi
echo "Copiando fuentes..."
cd "$DIR"
for i in *."$EXT"; do
sudo cp -iv "$i" "$DEST"
done
echo
echo
echo "Actualizando la caché de fuentes..."
sudo fc-cache -fv
if [ $? != 0 ]; then
echo "Error actualizando la caché de fuentes. Tus fuentes no se han instalando correctamente. Prueba a ejecutar sudo fc-cache -fv manualmente. Saliendo..."
echo -n "Pulsa para salir. "
read FSF
exit $?
fi
echo
echo
echo "Proceso terminado."
echo
echo "Probablemente necesitarás reiniciar los programas que están en marcha para poder usar estas fuentes."
echo -n "Pulsa para salir. "
read WERT
exit 0

Lo guardamos en la carpeta fuentes,con el nombre de instalador
01 guardando instalador
lo haremos ejecutable:
chmod +x instalador
y lo ejecutaremos:
.\instalador
pulsamos ENTER cada vez que nos pregunte algo. Obtendremos una salida tal como esta:

$ ./instalador
¿En qué directorio están las fuentes?
[/home/uno/fuentes] (PULSA ENTER)
¿Cuál es la extensión (sin el punto) de las fuentes? (ojo, no es lo mismo ttf que TTF)
[ttf] (PULSA ENTER)
¿Dónde instalo las fuentes?
¡NO CAMBIES ESTO A NO SER QUE SEPAS LO QUE HACES!
[/usr/share/fonts/truetype/font-install] (PULSA ENTER)
Copiando fuentes...
«All Star Resort.ttf» -> «/usr/share/fonts/truetype/font-install/All Star Resort.ttf»
Actualizando la caché de fuentes...
/usr/share/fonts: caching, new cache contents: 0 fonts, 3 dirs
/usr/share/fonts/X11: caching, new cache contents: 0 fonts, 6 dirs
/usr/share/fonts/X11/100dpi: caching, new cache contents: 0 fonts, 0 dirs
/usr/share/fonts/X11/75dpi: caching, new cache contents: 0 fonts, 0 dirs
/usr/share/fonts/X11/Type1: caching, new cache contents: 43 fonts, 0 dirs
/usr/share/fonts/X11/encodings: caching, new cache contents: 0 fonts, 1 dirs
/usr/share/fonts/X11/encodings/large: caching, new cache contents: 0 fonts, 0 dirs
/usr/share/fonts/X11/misc: caching, new cache contents: 0 fonts, 0 dirs
/usr/share/fonts/X11/util: caching, new cache contents: 0 fonts, 0 dirs
/usr/share/fonts/truetype: caching, new cache contents: 2 fonts, 19 dirs
/usr/share/fonts/truetype/arphic: caching, new cache contents: 4 fonts, 0 dirs
/usr/share/fonts/truetype/font-install: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/freefont: caching, new cache contents: 12 fonts, 0 dirs
/usr/share/fonts/truetype/latex-xft-fonts: caching, new cache contents: 7 fonts, 0 dirs
/usr/share/fonts/truetype/openoffice: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/sazanami: caching, new cache contents: 2 fonts, 0 dirs
/usr/share/fonts/truetype/thai: caching, new cache contents: 51 fonts, 0 dirs
/usr/share/fonts/truetype/ttf-arabeyes: caching, new cache contents: 39 fonts, 0 dirs
/usr/share/fonts/truetype/ttf-bengali-fonts: caching, new cache contents: 5 fonts, 0 dirs
/usr/share/fonts/truetype/ttf-bitstream-vera: caching, new cache contents: 10 fonts, 0 dirs
/usr/share/fonts/truetype/ttf-dejavu: caching, new cache contents: 21 fonts, 0 dirs
/usr/share/fonts/truetype/ttf-indic-fonts-core: caching, new cache contents: 11 fonts, 0 dirs
/usr/share/fonts/truetype/ttf-kannada-fonts: caching, new cache contents: 7 fonts, 0 dirs
/usr/share/fonts/truetype/ttf-lao: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/fonts/truetype/ttf-liberation: caching, new cache contents: 12 fonts, 0 dirs
/usr/share/fonts/truetype/ttf-oriya-fonts: caching, new cache contents: 2 fonts, 0 dirs
/usr/share/fonts/truetype/ttf-telugu-fonts: caching, new cache contents: 2 fonts, 0 dirs
/usr/share/fonts/truetype/unfonts: caching, new cache contents: 4 fonts, 0 dirs
/usr/share/fonts/truetype/wqy: caching, new cache contents: 2 fonts, 0 dirs
/usr/share/fonts/type1: caching, new cache contents: 0 fonts, 1 dirs
/usr/share/fonts/type1/gsfonts: caching, new cache contents: 35 fonts, 0 dirs
/usr/share/X11/fonts: skipping, no such directory
/usr/local/share/fonts: caching, new cache contents: 0 fonts, 0 dirs
/home/uno/.fonts: skipping, no such directory
/usr/share/fonts/truetype/ttf-malayalam-fonts: skipping, no such directory
/var/cache/fontconfig: cleaning cache directory
/home/uno/.fontconfig: cleaning cache directory
/home/uno/.fontconfig: invalid cache file: 63a4f2800cb770cfbf6fd5bd92ba9af9-x86.cache-2
fc-cache: succeeded
Proceso terminado.
Probablemente necesitarás reiniciar los programas que están en marcha para poder usar estas fuentes.
Pulsa para salir.

Con todo esto ya tendremos instalada el nuevo tipo de letra.
3) Hacer un reloj digital, con el tipo de letra que acabamos de instalar.
En la pagina: http://gambaslinux.wordpress.com/2007/12/11/%C2%BFcomo-construir-un-reloj-digital/
nos explican como hacer un reloj digital.
Una vez realizado lo que nos cuentan, en la etiqueta1, vamos a cambiar el tipo de letra:
02 cambio de letra de un textbox
Y ejecutamos el código obtenemos nuestro reloj digital con el tipo de letra “ALLSTAR”:
03 reloj final
Bueno, espero que os haya gustado esta combinación de información de varias paginas web, y de nuevo darle las gracias a los autores de las paginas a las que me he referido, sin ellas no hubiera podido hacerlo.

Listbox: gestionarlo

Aqui os enseño parte del código necesario para gestionar un listbox: borrar, insertar, mover (al final, abajo, arriba, al inicio), como aparece en el siguiente pantallazo:
Pantallazo-Editando columnas

PUBLIC SUB Form_Open()
ME.center
Ftitulos.Caption = "Editando "
TextBox1.SetFocus
END
PUBLIC SUB ToggleButtonArriba_Click()
DIM intercambio AS String
IF listbox1.index > 0 THEN
intercambio = ListBox1[ListBox1.index - 1].text
ListBox1[ListBox1.index - 1].text = ListBox1[ListBox1.index].text
ListBox1[ListBox1.index].text = intercambio
listbox1[listbox1.index - 1].Selected = 1
ENDIF
END
PUBLIC SUB ToggleButtonInicio_Click()
DIM a AS Integer
FOR a = 0 TO listbox1.Index - 1
ToggleButtonArriba_Click()
NEXT
END
PUBLIC SUB ToggleButtonBaja_Click()
DIM intercambio AS String
IF listbox1.index < listbox1.count - 1 THEN
intercambio = ListBox1[ListBox1.index + 1].text
ListBox1[ListBox1.index + 1].text = ListBox1[ListBox1.index].text
ListBox1[ListBox1.index].text = intercambio
listbox1[listbox1.index + 1].Selected = 1
ENDIF
END
PUBLIC SUB ToggleButtonFin_Click()
DIM a AS Integer
FOR a = listbox1.Index TO listbox1.count
ToggleButtonBaja_Click()
NEXT
END
PUBLIC SUB TextBox1_KeyPress()
IF (key.Code = key.Enter OR key.Code = key.Return) AND TextBox1.text "" THEN
insertar.SetFocus
ENDIF
END
PUBLIC SUB insertar_Click()
ListBox1.Add(TextBox1.text)
TextBox1.text = ""
TextBox1.SetFocus
END
PUBLIC SUB borrar_Click()
ListBox1.Remove(ListBox1.Index)
END

Propiedades utilizadas.
listbox1.index: hace referencia al indice actualmente seleccionado
listbox1.remove(indice): para borrar el dato que este en el lugar indicado por indice
listbox1.add(“texto”): añade al listbox1 “texto”
listbox1.count: nos dice el numero de datos que contiene el listbox
Otra orden interesante es .setfocus que hace que el foco (cursor) se vaya al boton, textbox o cualquier control que deseemos.

Ejemplo de Drag & Drop

Gracias al foro de http://www.gambas-es.org/ y a sus integrantes que me han ayudado a resolver mis dudas sobre drag y drop, he podido realizar este pequeño programa para ejemplo de su aplicación.
Se trata de utilizar drag y drop entre textbox y listbox, (pasarse datos con coger y soltar), que resultara muy cómodo al usuario de nuestros programas a la hora de añadir datos, moverlos, etc..

Y este es el codigo del formulario principal:

' Gambas class file
'propiedades drog:
'TextBox2.Drop debes declararlas desde el editor de propiedades TRUE
'ListBox1.Drop debes declararlas desde el editor de propiedades TRUE
'listbox2.Drop debes declararlas desde el editor de propiedades TRUE
PUBLIC SUB Form_Open()
ListBox1.Add("Andalucia")
ListBox1.Add("Canarias")
listbox1.add("Murcia")
END
'coger
PUBLIC SUB TextBox1_MouseDrag()
IF Mouse.Left THEN
TextBox1.Drag(TextBox1.Text)
ENDIF
END
PUBLIC SUB ListBox1_MouseDrag()
IF Mouse.Left THEN
listbox1.Drag(ListBox1[ListBox1.index].text)
ENDIF
END
PUBLIC SUB ListBox2_MouseDrag()
IF Mouse.Left THEN
listbox2.Drag(ListBox2[ListBox2.index].text)
ENDIF
END
'soltar
PUBLIC SUB TextBox2_Drop()
TextBox2.text = Drag.Data
END
PUBLIC SUB ListBox1_Drop()
ListBox1.Add(Drag.data)
END
PUBLIC SUB listbox2_Drop()
ListBox2.Add(Drag.data)
END

Aqui teneis el codigo fuente