Ejemplo de aplicacion con Reportes

A continuacion coloco un ejemplo un poco mas completo de como generar reportes con html. El sistema ademas incorpora algunos topicos importantes cuando diseñamos sistemas tales como: validacion de usuarios y contraseñas, carga de una data en un control (por ejemplo, un combobox), reportes con boton de impresión, etc.

Espero les sea de utilidad. El link para descargar, aqui.

Uso de Clases en Gambas

Como ya sabemos Gambas es un lenguaje de programacion orientada a objetos. Pero realmente como utilizar o poner en practica esos conceptos de herencia, clases, polimorfismo, etc. Pues bien, aqui les coloco un ejmplo que se encuentra en el Libro GAMBAS “Programación Visual con Software Libre”, el cual he mejorado un poco para su entendimiento. Para descargarlo pulse aqui.

Nota: Es un programa de consola, pero el ejemplo es valido para ser aplicado en proyectos con interfaz grafica.

Envio de Correo Electronico

En esta oportunidad les coloco un programa que permite enviar correo electronico leido desde una base de datos en mysql y que muestra al final, en un listbox, todos los e-mail enviados. ademas tiene una opcion de consulta y envio individual. Se debe tomar en consideracion que para enviar exitosamente un email desde GNU/Linux, deben tener instalado algun programa de servidor de correo, como sendmail o postfix. Les recomiendo este ultimo por su facilidad de configurar al momento de su instalacion. El enlace al programa, aqui.

Nota: No se incluye la Base de datos hecha en MYSQL.

Jugando con las Ventanas y Controles

Este programa que se anexa realiza la redimension de un formulario al mismo tiempo que recorre la pantalla del pc en sentido de izquierda a derecha. Este es un ejercicio sencillo para los alumnos de Programación 4 del IUT “Jacinto Navarro Vallenilla” de Carúpano.

El codigo debe ser colocado dentro de un objeto timer. basicamente debe ser este:

PUBLIC SUB Timer1_Timer()
DIM acumulador AS Integer

carl2.X = carl2.X + acumulador + 5

IF carl2.X = 100 THEN
carl2.Y = carl2.Y + 10
acumulador = carl2.X
carl2.Height = carl2.Height – 50
carl2.Width = carl2.Width – 50
Timer1.Delay = Timer1.Delay – 10
carl2.X = 0

IF carl2.Width = 50 OR carl2.Height = 50 THEN
Message.Info(“Estoy muy chiquito\n cierrame por favor…”)
ME.Close
ENDIF

ENDIF

END

Deben tomar en consideracion lo siguiente:

  1. En este caso Carl2 es el nombre de un formulario (ventana).
  2. Las propiedades width y height deben inicializarse en 500, usando la barra de propiedades.
  3. OJO: A los alumnos de la materia programacion 4 del IUT JNV. el Jueves 5 y viernes 6, tienen examen, parecido a esto pero un poco mas fuerte.

Consultas: todas las que quieran.

saludos.

Uso del Objeto DataChooser

A continuación les dejo un ejemplo de como evitarse largos codigos para validar fechas, solo con el uso del Objeto dataChooser. Tambien se incluye un menu contextual y como hacer para ejecutar sus opciones.

Primero diseña un formulario como en que aparece a continuacion:

reloj.png

Luego agregamos el siguiente codigo:

‘ Gambas class file

PUBLIC SUB Almanaque_Change()

TextFecha.Text = Almanaque.Day & “/” & Almanaque.Month & “/” & Almanaque.Year
Almanaque.Visible = FALSE

END

PUBLIC SUB Button1_Click()

Almanaque.Visible = TRUE
Almanaque.X = 56
Almanaque.y = 64
‘button1.Picture = Picture["gambas.jpg"]

END

PUBLIC SUB Form_Open()

FMain.Title = “Ejemplo de Validación de Fechas”
ME.Center()

END

PUBLIC SUB form_Menu()

popup0.Popup()

END

PUBLIC SUB Button2_Click()
DIM cerras AS Integer

cerras = Message.Warning(“Desea cerrar el programa\n tome una decision”, “Si”, “No”)
IF cerras = 1 THEN
ME.Close
ENDIF

END

PUBLIC SUB popup2_Click()

Message.Info(“Aqui va la info”)

END

Pronosticador de Loterias

Debo confesar que desde que vi la catedra de estadistica en el Tecnologico deje a un lado los juegos de azar. Sin embargo, cuando “jugaba triples y terminales” cree un programa que me permitiera obtener aciertos de manera frecuente. Los resultados no fueron muy alentadores, pero debo confesar que algunas oportunidades el programa acertaba determinada loteria. Pues bien, he traducido el codigo a Gambas y aqui se los dejo para que lo estudien, y quien sabe, si lo ponen en practica quizas ganen un dinerito extra… nunca esta demas…

Paso 1: El Formulario

loteria

Paso 2: El Codigo

‘ Gambas class file

PUBLIC Control AS Boolean
PUBLIC Control2 AS Boolean

PUBLIC SUB Visibles()

TextBox5.Visible = TRUE
TextBox6.Visible = TRUE
TextBox7.Visible = TRUE
TextBox8.Visible = TRUE
TextBox9.Visible = TRUE
TextBox10.Visible = TRUE

END

PUBLIC SUB NoNumerico()

IF IsNumber(Val(TextBox2.Text)) = FALSE OR IsNumber(Val(TextBox3.Text)) = FALSE OR IsNumber(Val(TextBox4.Text)) = FALSE THEN
Message.Info(“Solo se aceptan Valores numericos”)
Control2 = TRUE
Limpiar
TextBox1.SetFocus
ELSE
Control2 = FALSE
END IF

END

PUBLIC SUB Invisibles()

TextBox5.Visible = FALSE
TextBox6.Visible = FALSE
TextBox7.Visible = FALSE
TextBox8.Visible = FALSE
TextBox9.Visible = FALSE
TextBox10.Visible = FALSE

END

PUBLIC SUB Validacion()

IF TextBox2.Text = “” OR TextBox3.Text = “” OR TextBox4.Text = “” THEN
Control = TRUE
Message.Info(“Existen casillas vacias”)
Limpiar
TextBox2.SetFocus
ELSE
Control = FALSE
END IF

END

PUBLIC SUB Limpiar()

TextBox1.Text = “”
TextBox2.Text = “”
TextBox3.Text = “”
TextBox4.Text = “”
TextBox5.Text = “”
TextBox6.Text = “”
TextBox6.Text = “”
TextBox7.Text = “”
TextBox8.Text = “”
TextBox9.Text = “”
TextBox10.Text = “”

END

PUBLIC SUB Form_Open()
Invisibles
END

PUBLIC SUB Button1_Click()

ME.Close

END

PUBLIC SUB Button2_Click()
Limpiar
label7.Text = “”
TextBox1.SetFocus
Invisibles
END

PUBLIC SUB Button3_Click()
Validacion
NoNumerico
IF Control = FALSE AND Control2 = FALSE THEN
Visibles
Label7.Text = “Para la Loteria de ” & TextBox1.Text

TextBox5.Text = Int(Rnd(0, Val(TextBox2.Text) + 1))
TextBox6.Text = Int(Rnd(0, Val(TextBox3.Text) + 1))
TextBox7.Text = Int(Rnd(0, Val(TextBox4.Text) + 1))
TextBox8.Text = Int(Rnd(9, Val(TextBox2.Text) + 1))
TextBox9.Text = Int(Rnd(9, Val(TextBox3.Text) + 1))
TextBox10.Text = Int(Rnd(9, Val(TextBox4.Text) + 1))
END IF

END

La Torre de Hanoi

En esta oportunidad les presento el famoso problema de la torre de Hanoi, pero con la particularidad que se maneja como un juego donde debemos hacer click sobre los anillos que conforman la torre para moverla de un lugar a otro. Este programa es bastante completo e incorpora elementos que hasta ahora no habiamos estudiado en este blog, como por ejemplo, slider, LCDnumber, DrawingArea, etc. Este programa no es de mi propiedad, fue enviado por un visitante de este foro a mi correo electronico. Muy agradecido por su aporte.

El formulario: Torre de Hanoi

El codigo del Formulario:

myHanoi AS Chanoi
myTower AS Integer[]
myTowerDep AS Integer
myTowerArr AS Integer
turn AS Integer
start AS Boolean
starttxt AS String
stoptxt AS String
movetxt AS String
towdeptxt AS String

PUBLIC SUB form_open()

myHanoi = NEW Chanoi

start = FALSE
turn = 1
myTowerDep = 0
myTowerArr = 0

slider1_change()

END

PUBLIC SUB Slider1_change()

DIM i AS Integer
DIM j AS Integer

LCDNumber1.Value = slider1.Value
drawTowers()

j = slider1.Value – 2

FOR i = 0 TO (slider1.Value) – 1
drawdisk(1, i + 1, (slider1.Value) – i)
NEXT

END

PUBLIC SUB Quit_Click()

DIM choice AS Integer

choice = Message.Question((“Are you sure ?”), (“&Yes”), (“&No”))

IF choice = 1 THEN
ME.Close
ENDIF

END

PUBLIC SUB Button1_Click()

IF start = TRUE THEN
start = FALSE
turn = 1
button1.Text = (“Start”)
TextLabel1.text = (“Choose the number of disks then press Start”)
slider1.Enabled = TRUE
slider1_change
RETURN
ENDIF

start = TRUE
button1.Text = (“Stop”)
TextLabel1.text = (“Move”) & ” ” & turn & ” ” & (“: choose the starting tower”)
slider1.Enabled = FALSE
myHanoi.init(slider1.value)

END

PUBLIC SUB DrawingArea1_MouseDown()

DIM X AS Integer
DIM y AS Integer
DIM Bckgd AS Integer

IF start = FALSE THEN
RETURN
ENDIF

X = (Mouse.X / 210) + 1

IF myTowerDep = 0 THEN
myTowerDep = X
TextLabel1.text = (“Move”) & ” ” & turn & ” ” & (“: choose the destination tower”)
RETURN
ENDIF

IF myTowerDep = X THEN
myTowerDep = 0
TextLabel1.text = (“Move”) & ” ” & turn & ” ” & (“: choose the starting tower”)
RETURN
ENDIF

myTowerArr = X

IF NOT myHanoi.moveDisk(myTowerDep, myTowerArr) THEN
Bckgd = DrawingArea1.Background
TextLabel1.Background = color.Red
TextLabel1.text = (“Move”) & ” ” & turn & ” ” & (“: illegal move !”)
WAIT 2
TextLabel1.Background = Bckgd
TextLabel1.text = (“Move”) & ” ” & turn & ” ” & (“: choose the starting tower”)
myTowerDep = 0
myTowerArr = 0
RETURN
ENDIF

moveTowers()

IF ((myHanoi.getTower(3)).length = slider1.Value) THEN
win()
RETURN
ENDIF

myTowerDep = 0
myTowerArr = 0
INC (turn)

TextLabel1.text = (“Move”) & ” ” & turn & ” ” & (“: choose the starting tower”)

END

PRIVATE PROCEDURE moveTowers()

DIM i AS Integer
DIM j AS Integer
DIM k AS Integer

drawTowers()

FOR i = 1 TO 3
myTower = myHanoi.getTower(i)

IF myTower.length THEN
FOR j = 1 TO myTower.length
drawDisk(i, j, myTower[j - 1])
NEXT
ENDIF
NEXT

END

PRIVATE PROCEDURE win()

message.Info((“Congratulation !\nYou have win in”) & ” ” & turn & ” ” & (“moves.”), (“&Ok”))
button1_click()

END

PRIVATE PROCEDURE drawTowers()

‘ the three empty towers

DIM i AS Integer

DrawingArea1.clear
DrawingArea1.Border = Border.Sunken
DRAW.Begin(DrawingArea1)
DRAW.ForeColor = color.Black
DRAW.FillStyle = fill.Solid
DRAW.FillColor = color.DarkRed

FOR i = 0 TO 2
DRAW.rect(5 + (i * 205), 160, 200, 20)
DRAW.Rect(102 + (i * 205), 5, 6, 155)
NEXT

DRAW.End

END

PRIVATE PROCEDURE drawDisk(tower AS Integer, pos AS Integer, size AS Integer)

DIM myX AS Integer
DIM myY AS Integer
DIM myL AS Integer
DIM myEp AS Integer
DIM mySpace AS Integer
DIM tower2tower AS Integer

tower2tower = 205
mySpace = 2
myEp = 13
myX = 100 – ((size – 1) * 10) + tower2tower * (tower – 1)
myY = 160 – ((mySpace + myEp) * pos)
myL = 10 + ((size – 1) * 20)

DRAW.Begin(DrawingArea1)
DRAW.ForeColor = color.Black
DRAW.FillStyle = fill.Solid
DRAW.FillColor = color.Blue
DRAW.rect(myX, myY, myL, myEp)
DRAW.End

END

El codigo de la Clase que llamaremos Chanoi (si… aqui vamos a crear una clase… fantastico no?)

PRIVATE tower1 AS NEW Integer[]
PRIVATE tower2 AS NEW Integer[]
PRIVATE tower3 AS NEW Integer[]
PRIVATE height AS Integer

PUBLIC SUB init(h AS Integer)

DIM i AS Integer

tower1.Clear
tower2.Clear
tower3.Clear
height = h

FOR i = h TO 1 STEP -1
tower1.Push(i)
NEXT

END

PUBLIC FUNCTION getTower(t AS Integer) AS Integer[]

SELECT t
CASE 1
RETURN tower1
CASE 2
RETURN tower2
CASE 3
RETURN tower3
END SELECT

END

PUBLIC FUNCTION moveDisk(st AS Integer, ar AS Integer) AS Boolean

DIM tw1 AS Integer[]
DIM tw2 AS Integer[]

SELECT st
CASE 1
tw1 = tower1
CASE 2
tw1 = tower2
CASE 3
tw1 = tower3
END SELECT

SELECT ar
CASE 1
tw2 = tower1
CASE 2
tw2 = tower2
CASE 3
tw2 = tower3
END SELECT

IF tw1.Length = 0 THEN
RETURN FALSE
ENDIF

IF tw2.Length = 0 THEN
tw2.Push(tw1.Pop())
RETURN TRUE
ENDIF

IF tw2[tw2.Length - 1] < tw1[tw1.Length - 1] THEN
RETURN FALSE
ENDIF

tw2.Push(tw1.Pop())
RETURN TRUE

END

Ordenación Por Metodo de la Burbuja

La tecnica de ordenación por burbuja compara elementos consecutivos de la lista, de modo que si en una pasada no ocurrieran intercambios, significaria que la lista esta ordenada. Este metodo es muy clasico y sencillo, y por lo general es uno de los primeros ejercicios que les colocan a los estudiantes de informatica y computacion cuando ven el capitulo que corresponde a vectores.

A continuacion les coloco un programa que realiza ordenacion por metodo de la burbuja bajo Gambas. Esta hecho como un programa de consola.

PUBLIC SUB Main()
DIM Columna AS Integer
DIM N, i, j, Aux AS Integer
DIM Limite AS Integer

DIM vector AS Integer[]
vector = NEW Integer[]

PRINT “Ingrese el limite maximo a leer el vector:”
INPUT Limite

FOR Columna = 0 TO Limite
PRINT “Ingresa un Numero “
INPUT N
vector.Add(N)
NEXT
‘Este es el Procedimiento Burbuja
‘para ordenar los datos que contiene el vector
FOR i = 0 TO Limite – 1
FOR j = 0 TO Limite – 1
IF Vector[j] > vector[j + 1] THEN
‘En esta parte se realiza el intercambio
Aux = vector[j]
vector[j] = vector[j + 1]
vector[j + 1] = Aux
END IF
NEXT
NEXT

PRINT
‘Por ultimo procedemos a imprimir el vector
FOR j = 0 TO Limite
PRINT vector[j]
NEXT
END