jueves, 19 de julio de 2012

TreeView.Continentes y Países

En estos ejemplos continuamos con el componente TreeView.

En el primero vamos a crear en un Treeview una lista alfabética
en el que iremos añadiendo los países contenidos en  un archivo de texto.
Según la letra por la que comience el país se añadirá a la letra que le
corresponda.


---código---
 Private apaises As String[]

Public Sub Form_Open()
  Me.Center     'Centramos nuestro formulario
  Me.Title = "Paises"
  CreaNodos
  LeeArchivoPaises
  apaises.Sort  'Ordenamos el array para cuando clasifique,estén los países por orden en sus nodos padres.Probar a comentar esta instrucción
  Clasificar
  tvListaPaises["Paises"].Expanded = True 'Mostramos expandido el nodo raiz "Paises"
End

Public Sub CreaNodos()
  Dim x As Integer
 
  tvListaPaises.Add("Paises", "Paises") 'Creamos nuestro nodo raíz
  For x = 65 To 90
      tvListaPaises.Add(Chr(x), Chr(x),, "Paises")  'Con el rango de código ascii que representa una letra, creamos los nodos padres
  Next
End

Public Sub LeeArchivoPaises()
  Dim spais As String
 
  spais = File.Load("paises2.txt")  'Añado todo el contenido del archivo paises2.txt a la variable de cadena spais
  apaises = Split(spais, "\n")      'Utilizamos como separador el salto de linea
  apaises.Remove(apaises.Count - 1) 'Eliminamos el ultimo elemento del array por que es un espacio en blanco

End

Public Sub Clasificar()
  Dim spais As String
 
  For Each spais In apaises
    tvListaPaises.Add(spais, spais,, Left(spais, 1)) 'Añadimos a cada nodo padre cada país que comienza con la letra del nodo
  Next

End

Public Sub tlbSalir_Click()
  Me.Close
End
---código---

En este otro ejemplo.Vamos a usar instrucciones para
trabajar con archivos de texto.Aunque no he tratado el tema aun en el
blog.(Queda pendiente).En este ejemplo tendremos los nombres
de los continentes y añadiremos los países a su continente correspondiente.
La estructura del archivo de texto nos ayuda mucho.Es importante.


---código---
'Es importante conocer la estructura del archivo de texto para poder leerlo
'y distribuir sus datos según nos convenga
'Esto es una manera de hacerlo, naturalmente, podrá haber más. ;-)

'En otro ejemplo, hablaremos del manejo de los archivos de texto


Public Sub Form_Open()



End


Public Sub btnSalir_Click()
  Me.Close
End

Public Sub btnMostrar_Click()
  Dim archivo As File                                                 'Definimos archivo como el tipo archivo o fichero
  Dim linea As String                                                 'Cada linea que leemos del archivo se almacena en linea
  Dim nomcontinente As String                                         'El nombre del continente
  Dim pais As String                                                  'El nombre del país
 
  tvContinentes.Clear                                                 'Borramos el contenido del TreeView por si hacemos click más de una vez en Mostrar
  
  archivo = Open "paises.txt" For Input                               'Abrimos nuestro archivo para lectura.Input,entrada
 
  tvContinentes.Add("Continentes", "Continentes")                     'Creamos el nodo raiz Continentes
  Line Input #archivo, linea                                          'Leemos una linea del arhivo paises.txt.No incluye nada.Podia haber sido borrada en el archivo de texto
  Do While Not Eof(archivo)                                           'Entramos en una secuencia repetitiva que se ejecuta "mientras no llegue al final del archivo" Eof.End of File
    Line Input #archivo, linea
    nomcontinente = Trim(linea)                                       'La linea leída contiene texto,eliminamos sus espacios en ambos lados y asignamos a nomcontinente
    tvContinentes.Add(nomcontinente, nomcontinente,, "Continentes")   'Creo un nodo padre en el nodo raiz

    Line Input #archivo, linea                                        'Una linea vacía, en blanco
    Line Input #archivo, linea
    Do While linea <> "" And Not Eof(archivo)                         'Si la linea contiene texto y no hemos llegado al final del archivo.Ejecutar el bucle
      pais = Trim(linea)
      tvContinentes.Add(pais, pais,, nomcontinente)                    'Agrego un nodo hijo a cada nodo padre
      Line Input #archivo, linea                                       'Leemos la siguiente linea del archivo
    Loop
  Loop
  Close archivo                                                       'Cuando llegamos al final y terminamos de leer el archivo,lo cerramos.
 
  'Cuestión. ¿ Por que hemos usado bucle While y no un For ?. ;-)
   
End

---código---

Como los comentarios son largos se deforman en la pagina.
Aquí tenéis los códigos para poder verlo mejor.

Ejemplo 2

Ejemplo 3



martes, 17 de julio de 2012

Componente TreeView.Ejemplo 1


Este componente es parecido a ListView, cada elemento tiene su clave y añade
la vista en árbol de los elementos. Añade texto y una imagen si queremos,los cuales
podemos seleccionar.

Con la clave, sabremos a que rama en cuestión pertenece el elemento.
Volvemos a usar propiedades como “Item” y “Current”. Estas propiedades
son muy comunes en estos componentes semejantes a listas. Repasar ListView.

En este ejemplo, seleccionamos una opción si es una amistad, cliente o proveedor
y se añade a su rama concreta con el botón. También podemos eliminarlo del TreeView.


---código---
Private numpersona As Integer
Private opcionseleccionada As Integer
Private imagen1 As Picture
Private imagen2 As Picture

Public Sub _new()

End

Public Sub Form_Open()

Me.Title = "Ejemplo con TreeView"
Me.Center

imagen1 = Picture["Alegre.png"]
imagen2 = Picture["Serio.png"]

tvContactos.Add("Contactos", "Contactos") 'Nodo Raíz
tvContactos.Add("Amistades", "Amistades",, "Contactos") 'Nodo Padre
tvContactos.Add("Clientes", "Clientes",, "Contactos") 'Nodo Padre
tvContactos.Add("Proveedores", "Proveedores",, "Contactos") 'Nodo Padre
tvContactos["Contactos"].Expanded = True 'Presentamos el nodo raíz abierto o expandido

numpersona = 1 'Iniciamos el contador de personas en 1

End

Public Sub btnBorrar_Click()
'No queremos borrar el nodo raíz ni tampoco sus nodos padres
If tvContactos.Key <> "Contactos" And tvContactos.Key <> "Amistades" And tvContactos.Key <> "Clientes" And tvContactos.Key <> "Proveedores" Then
tvContactos.Remove(tvContactos.Key)
Else
Message.Info("No se puede eliminar el nodo raíz o padre")
Endif
End

Public Sub Contactos_Click()
opcionseleccionada = Last.tag
End


Public Sub btnSalir_Click()
Me.Close
End

Public Sub btnAdd_Click()
'Según seleccionamos nuestra opción, añadimos un nodo hijo al nodo padre
Select Case opcionseleccionada
Case 0
tvContactos.Add("Persona-" & numpersona, "Persona-" & numpersona, imagen1, "Amistades")
Case 1
tvContactos.Add("Persona-" & numpersona, "Persona-" & numpersona, imagen2, "Clientes")
Case 2
tvContactos.Add("Persona-" & numpersona, "Persona-" & numpersona, imagen2, "Proveedores")
End Select
numpersona += 1 'Aumentamos el número de personas
End

---código---


Nuestra raíz principal, tiene la key o clave “Contactos” con el nombre “Contactos”.
Añadimos el nodo “Amistades”, con nombre “Amistades” a la rama principal “Contactos”.

Hemos usado.

tvContactos.Add("Amistades", "Amistades",, "Contactos") 'Nodo padre
Como no añadimos una imagen, dejamos esa opción vacía en el método .Add.

Y repetimos la misma operación para los nodos “Cliente” y “Proveedores” que son nodos padres. Las opciones de los contactos están formadas por una matriz de controles. Acordaros del ejemplo de la calculadora. Los números formaban parte de un grupo, con un código común para todos los números evitando la repetición del mismo código por cada número.

En este caso, guardamos el valor de “last.tag” en una variable común a todo
el formulario para saber que opción fue seleccionada, (el índice del grupo). 
Para que nuestro botón de añadir, sepa que tipo de contacto debe añadir.

Mas información en:


Aquí tenéis el código del ejemplo 1.

lunes, 16 de julio de 2012

Otro ejemplo de ListView

En este ejemplo no he utilizado imágenes.

- Veremos como se hace una búsqueda en un array, con el método .Find
  Aprovechando para mostrar y borrar un registro o
  elemento del ListView.
- Como hacemos un grupo de instrucciones sobre una variable.
- Como eliminar y añadir elementos a un ListView

En esta aplicación de ejemplo tenemos los datos de identidad,nombre y apellidos de un ciudadano.

En la lista se añade su numero de identidad.Si lo seleccionamos podemos ver
en las cajas de texto los datos.También pueden ser eliminados de la lista.




El código esta documentado ,no lo he añadido aquí ya que los comentarios
deforman un poco la presentación al ser largos.

Podéis bajar el código aquí:



domingo, 15 de julio de 2012

Componente ListView


Este componente es muy parecido a ListBox con la posibilidad de poder añadir
un icono al texto de cada elemento.

Cada elemento que añadimos consta de una clave “key” que es única por cada elemento
de la lista, no se repite.

Para la selección de componente en vez de la propiedad “Index”.Usamos
“Item”.

Con Item podemos averiguar su texto y su imagen.

Hay que practicar para conocer este componente si estamos acostumbrado a ListBox. No entraña mucha dificultad y si mejoras.

He creado este ejemplo, con banderas marítimas internacionales para señales.
Donde podéis ver como se añade la clave, su nombre y si queremos una imagen.



Aquí podéis bajar el ejemplo.


Y aquí encontrareis mas información.




Componente ListBox


Este componente presenta una lista de elementos seleccionables.

Al hacer click en uno de los elementos su índice es almacenado en la
propiedad .Index.

La propiedad .Current nos ofrece la posibilidad de conocer del
elemento actual seleccionado,su texto o si ha sido seleccionado un
elemento en concreto.

Lista.Current.Text
Lista.Current.Selected

Listbox es igual que un array de elementos.
Posee propiedades para conocer cuantos elementos tiene la lista, como la
propiedad .Count.

No debemos olvidar nunca que siempre el primer elemento en un array es 0.
Así que la propiedad .Count puede decirnos que tenemos un elemento, pero
su propiedad .Index al seleccionar este elemento es 0.

Al igual que teníamos un array:

aAmigos[1]

Con la propiedad Lista.List[1] hacemos la misma función con
nuestro componente ListBox.

Cuando no hemos seleccionado ningún elemento de la lista la propiedad
Index es -1

Tenemos métodos para ordenar nuestra Lista y de hacer búsquedas en ella.

Usamos siempre el método .Add para añadir elementos a nuestra lista.

Aquí tenéis un ejemplo para ver el funcionamiento básico
de este componente.


He utilizado el recurso que nos ofrece el componente de alineación Vbox, para
que tanto la caja de texto y los botones queden alineados.

El código es simple. ;-)

----código---
' Gambas class file

Public Sub _new()

End

Public Sub Form_Open()
   Me.Title = "Ejemplo con ListBox"
   Me.Center()
End

Public Sub btnInsertar_Click()
If txtEntrada.Text = "" Then 'Si no escribimos nada nos lo dice
   Message.Info("Debes escribir algo")
Else
   lstLista.Add(txtEntrada.text) 'Añadimos el contenido de la caja de texto a la lista
   lblSalida.Text = (txtEntrada.Text & " fue añadido a la lista")
   txtEntrada.text = ""
Endif
txtEntrada.SetFocus
End

Public Sub btnLimpiarLista_Click()
lstLista.Clear
lblSalida.Text = "La lista fue borrada"
End

Public Sub btnEliminar_Click()
If lstLista.Index >= 0 Then 'Si se ha seleccionado algún elemento.
   lblSalida.Text = lstLista.Current.Text & " fue eliminado"
   lstLista.Remove(lstLista.Index)
Else
If lstLista.Index = -1 Then
   Message.Warning("Debe seleccionar algún elemento de la lista")
Endif
Endif
End

Public Sub lstLista_Select()

If lstLista.Index <> -1 Then 'Si se ha seleccionado algún elemento.Otra manera de hacerlo.
   lblSalida.Text = Trim(lstLista.Current.Text) & " fue seleccionado"
Endif
End

Public Sub btnSalir_Click()
   Me.Close
End

Public Sub btnInsertar_Enter()
   btnInsertar.Font.bold = True 'Cuando el cursor este dentro del botón cambia el estilo de su fuente a negrita
End

Public Sub btnInsertar_Leave()
   btnInsertar.Font.Bold = False 'Cuando el cursor este fuera del botón cambia el estilo de su fuente a normal
End
---código---

Si os fijáis en los botones debajo de algunas letras existe un guión bajo. Este guión permite el uso de un acceso rápido al botón en cuestión.

Usamos la combinación de las teclas Alt + la letra para hacer lo
mismo que si hiciéramos click con el ratón en el botón.

¿ Cómo podemos hacer esto con nuestros botones de comando ?.

Vamos a la propiedad texto del botón y cerca de la letra que queremos
usar, añadirnos el carácter “&”, que conocemos como Ampersand.

No debemos repetir los mismos caracteres para usar los botones desde teclado
por que puede que el programa no responda como quisiéramos.

Aquí tenéis el ejemplo con su código.

Ejemplo de Listbox

Podéis encontrar mas información en:

En GambasDoc

martes, 10 de julio de 2012

Paso de parámetros por valor o por referencia.


Cuando queremos pasar un parámetro a un procedimiento,podemos hacerlo de dos maneras. La manera habitual de saber como se pasan los parámetros es fijarnos en el procedimiento o función que recibe el parámetro

Imaginar una rejilla, en la que hay celdas que contienen nuestras variables.
Cada celda es una dirección en la memoria de nuestro ordenador, con
un contenido con valor o vacío


Por valor:

Cuando pasamos por valor una variable a un procedimiento,no pasamos la
variable original,pasamos una copia de esta.(No sería la celda original).

La ventaja es que si dentro del procedimiento se cambiase el valor de la variable,al salir del procedimiento, nuestra variable contendrá su valor inicial.

En Gambas1 y Gambas2 solo era posible pasar parámetros por valor.

----código----
PUBLIC SUB Form_Open()

Dim sNombre AS String

sNombre=”Jose Luis”

'Llamamos al procedimiento, pasándole como parámetro la variable sNombre

VerNombre(sNombre)

'Al salir del procedimiento ,mostramos el valor de la variable sNombre,
'comprobando que no ha cambiado.

Message.info(“El valor del nombre es: “ & sNombre)

End


PUBLIC SUB VerNombre(sNom AS STRING)

'Vemos su valor original.

Message.info( “El valor original del parámetro es: “ & sNom)

'Cambiamos su valor y lo mostramos.

sNom=”Jose María”

Message.info(“El valor del parámetro se cambia a: “ & SNom)

END

---código---

No olvidéis cambiar el tipo de comillas al pegarlo en el editor de Gambas. ;-)


Por referencia:

Cuando pasamos un parámetro por referencia,estamos pasando el contenido
de la celda de memoria donde se encuentra el valor de nuestra variable.
Así que el procedimiento no manejara una copia de nuestra variable,
sino la variable original.

En la versión de Gambas3 podemos usar el paso de parámetros por referencia.
Para ello, debemos usar en la llamada al procedimiento la palabra ByRef
Y también debemos incluirla dentro de los parámetros del procedimiento
al que llamamos.


---código---
PUBLIC SUB Form_Open()

Dim sNombre AS String

sNombre=”Jose Luis”

'Llamamos al procedimiento, pasándole como parámetro la variable sNombre

VerNombre(ByRef sNombre)

'Al salir del procedimiento ,mostramos el valor de la variable sNombre,
'comprobando que ha cambiado.

Message.info(“El valor del nombre es: “ & sNombre)

End


PUBLIC SUB VerNombre(ByRef sNom AS STRING)

'Vemos su valor original.

Message.info( “El valor original del parámetro es: “ & sNom)

'Cambiamos su valor y lo mostramos.

sNom=”Jose María”

Message.info(“El valor del parámetro se cambia a: “ & SNom)

END
---código---

Otro ejemplo usando paso de parámetro por referencia.
No dividir por cero o dará error. ;-)

---código---
'Algoritmo que calcula el cociente y el resto de la división haciendo que estos resultados
'sean devueltos al algoritmo principal

Public Sub Form_Open()
Dim dividendo, divisor, cociente, resto As Integer

dividendo = InputBox("Ingrese el valor del dividendo")
divisor = InputBox("Ingrese el valor del divisor")

division(dividendo, divisor, ByRef cociente, ByRef resto)

Message.Info("Cociente: " & cociente & "\n" & "Resto: " & resto)

End

'Cabecera: division(Entrada divi,Entrada d,Salida c,Salida r)
'Precondición: dividendo >= divisor y ambos son mayores que 0
'Postcondición: devuelve a través de los parámetros de salida c y r, el cociente y el resto.


Public Sub division(divi As Integer, d As Integer, ByRef c As Integer, ByRef r As Integer) As Integer

c = divi Div d
r = divi Mod d

End

---código---
Como veis en la función división, tenemos paso por valor y referencia.
Espero que les sea útil.

sábado, 7 de julio de 2012