domingo, 26 de junio de 2011

Módulo Importar y Exportar desde el Portapapeles

Reutilizar los datos de otros programas o utilizar los nuestros en otros programas, es una de las cosas que todos nuestro programas deben de tener para asi ser mas util. ¿os imaginais que cada vez que tengais el listin con un monton de datos, no podais utilizarlo para por ejemplo, aprovechar la direccion de cada uno?? ¿tendrias que volverlo a escribir???
Bueno pues en con este módulo vamos a utilizar la forma mas sencilla que Existe de pasar datos de una programa a otro: EL PORTAPAPELES.



Exportar: Clipboard.Copy
En su dia creamos el modulo exportar, es ahora cuando vamos a añadir el codigo necesario para transferir la informacion del gridviewDatos al portapapeles.
En nuestro Fmain creamos un menu, elegimos exportar:




Y definimos el siguiente codigo en Fmain:
PUBLIC SUB Exp_Click()
exportar.copiaraportapapeles(gridViewDatos)
END


Nota:
A la hora de definir el editor de menus, asi se defineria el menu/importar exportar / exportar











Y en el módulo Exportar:
PUBLIC SUB copiaraportapapeles(rejilla AS GridView)
DIM texto AS String
DIM a AS Integer
DIM b AS Integer
IF rejilla.header = 1 OR rejilla.header = 3 THEN
FOR a = 0 TO rejilla.Columns.COUNT - 1
texto &= rejilla.Columns[a].Title & "\t"
NEXT
texto &= "\n"
ENDIF
FOR a = 0 TO rejilla.Rows.COUNT - 1
FOR b = 0 TO rejilla.Columns.COUNT - 1
texto &= revisa(rejilla[a, b].text) & "\t"
NEXT ' b
texto &= "\n"
NEXT 'a
Clipboard.Copy(texto)
END
--------------------------------------------------------------------
PUBLIC SUB revisa(cadena AS String) AS String
DIM a AS Integer
DIM letra AS String
DIM devuelta AS String
DIM prueba AS Integer
'compruebo si tiene solo numero
FOR a = 1 TO Len(cadena)
letra = Mid$(cadena, a, 1)
prueba = InStr("0123456789.", letra)
IF prueba = 0 THEN
RETURN cadena
'contiene letras
ENDIF
NEXT
FOR a = 1 TO Len(cadena)
letra = Mid$(cadena, a, 1)
IF letra = "." THEN
letra = ","
ENDIF
devuelta &= letra
NEXT
RETURN devuelta
END


Como vemos, se divide en dos subrutinas:
Las primera copiaraportapapeles”, se le pasa la rejilla que queremos que copie (rejilla AS GridView), y va leyendo los valores de los titulos de columanas y de las distintas filas, añadiendolo a una variable llamada texto, y con el comando Clipboard.Copy(texto), lo pasa al portapapeles.
La segunda subrutina, revisa convierte “el punto decimal” en coma decimal, para que por ejemplo una hoja de calculo lea correctamente los numeros.
Una vez pulsado en el menu “Exportar”, el contenido gridviewDatos actual (si esta filtrado, solo lo filtrado), pasa al portapapeles, pudiendose pegar en (por ejemplo openoffice Calc):
Abrimos openoffice Calc, pulsamos en el menu “Editar/Pegar”, nos saldra esta pantalla:

Pulsamo “Aceptar”, y obtenemos:



Importar: Clipboard.Paste



Para importar datos, tambien vamos a utilizar el Clipboard.Paste, por ejemlo lo vamos a hacer para que desde una hoja de calculo podamos volcar los datos en nuestro listin.
En el formulario Fmain, pulsamos en el menu Importar/Exportar / Importar




y escribimos el siguiente codigo:
PUBLIC SUB Imp_Click()
FOpenOfficeCalcGambas2.Show()
END
Crearemos un nuevo formulario: FopenOfficeCalcGambas2
y el siguiente codigo que se ejecutara cada vez que lo abramos:
PUBLIC SUB Form_Open()
GridViewLectura.Rows.COUNT = 1001
GridViewLectura.Columns.COUNT =20
END




El CheckBoxTitulos, si esta “checkqueado” quera decir que el contenido del portapapeles, en su primera linea contiene los titulos (cabeceras de los datos) o no (solo los datos). Leeremos esa propiedad cuando nos interese. (CheckBoxTitulos.value)
El boton “Pulse para leer del portapapeles” ejecuta el codigo de lectura del portapapeles
El boton “Añadir datos al listin” es el encargado de pasar los dados del gridviewlectura a la memoria.
El boton “Cancelar” cancelara todo el proceso.
Su codigo es asi de simple:
PUBLIC SUB ButtonCancelar_Click()
ME.Close()
END



Bueno, pues vamos por partes:
Código de “Pulse para leer del portapapeles” : Clipboard.Paste()
PUBLIC SUB leerportapapeles_Click()
DIM titulos AS Boolean
IF CheckBoxTitulos.value = -1 THEN
FOpenOfficeCalcGambas2.GridViewLectura.Header = 1
titulos = -1
ELSE
FOpenOfficeCalcGambas2.GridViewLectura.Header = 0
titulos = 0
ENDIF
GridViewLectura.Rows.COUNT = 0
GridViewLectura.Columns.COUNT = 0
GridViewLectura.Rows.COUNT = 1001
GridViewLectura.Columns.COUNT = 20
leer(FOpenOfficeCalcGambas2.GridViewLectura, titulos)
END
y la subrutina leer:
'------------------ leer rejilla ---------------------------------------------------------
PUBLIC SUB leer(rejilla AS gridview, titulos AS Boolean)
'rejilla: es el gridview donde se van a escribir los datos
'titulos: 0: sin titulo, -1 titulo contiene la 1º fila
DIM lineas AS String[]
DIM linea_procesada AS String
DIM columnas AS String[]
DIM a AS Integer
DIM c AS Integer
DIM cadena AS String
DIM portapapeles AS String
DIM finlinea AS String
DIM fincolumna AS String
finlinea = "\n" ' retorno de carro (separa las filas)
fincolumna = "\t" 'tabulador (separa las colunas)
portapapeles = Clipboard.Paste()
lineas = Split(portapapeles, finlinea)
FOR a = 0 TO lineas.COUNT - 1
linea_procesada = lineas[a]
columnas = Split(linea_procesada, fincolumna)
FOR c = 0 TO columnas.COUNT - 1
IF a = 0 AND titulos = -1 THEN
rejilla.Columns[c].title = columnas[c]
ELSE
IF titulos = 0 THEN rejilla[a, c].text = columnas[c]
IF titulos = -1 THEN rejilla[a - 1, c].text = columnas[c]
ENDIF
NEXT 'c
NEXT 'a
END



A comentar la orden más importante es portapapeles=Clipboard.Paste()
y con la orden Split() iremos separando lineas de texto con retorno de carro “\n” y los datos separados por tabulardor “\t”


Código para “Añadir datos al listin”
PUBLIC SUB ButtonAnadir_Click()
DIM a AS Integer
DIM repite AS Integer
IF CheckBoxTitulos.Value = TRUE THEN
'la primera linea contiene titulos
a = 1
ENDIF
FOR repite = a TO 1001
IF comprobarvacio(repite) <> 1 THEN
var.id.add("Id" & Str$(Now) & Str$(repite)) 'bug corregido 30/julio/2011 , betatester: sasogu
var.dni.add(GridViewLectura[repite, 3].text)
var.nombre.add(GridViewLectura[repite, 1].text)
var.apellidos.add(GridViewLectura[repite, 2].text)
var.empresa.add(GridViewLectura[repite, 4].text)
var.puesto.add(GridViewLectura[repite, 5].text)
var.telf_empresa.add(GridViewLectura[repite, 6].text)
var.telf_parti.add(GridViewLectura[repite, 8].text)
var.fax.add(GridViewLectura[repite, 10].text)
var.movil_empresa.add(GridViewLectura[repite, 7].text)
var.movil_parti.add(GridViewLectura[repite, 9].text)
var.pag.add(GridViewLectura[repite, 12].text)
' la imagen en el unico dato que no leemos, solo le añadimos el simbolo de la gambita
var.foto.add("icon:/16/gambas")
var.direccion.add(GridViewLectura[repite, 13].text)
var.observaciones.add(GridViewLectura[repite, 14].text)
var.fecha_datos.add(GridViewLectura[repite, 15].text)
var.correo.Add(GridViewLectura[repite, 11].text)
ELSE
GOTO finlectura
ENDIF
NEXT
finlectura:
titulo.rellena()
Message.Info("Datos cargados")
ME.Close
END
'----------si la fila no contine datos (todos son “”) entonces devuelve 0 ----------------------
PUBLIC FUNCTION comprobarvacio(fila AS Integer) AS Integer
DIM b AS Integer
FOR b = 0 TO 19 'tantas veces como columnas haya, para no ingresar registros en blanco
IF GridViewLectura[fila, b].text <> "" THEN
RETURN 0
ENDIF
NEXT
RETURN 1
END




A comentar:
1. La funcion comprobarvacio, hace que cuando la linea del gridviewlectura esta completamente vacia (sin texto en ninguna de sus columnas) devuelve 0, y el procedimiento principal ButtonAnadir_Click(), dejara de añadir información, en caso contrario devuelve 1, si sigue añadiendo el registro.
( IF comprobarvacio(repite) <> 1 THEN …. )


2. ' la imagen en el unico dato que no leemos, solo le añadimos el simbolo de la gambita
var.foto.add("icon:/16/gambas")
ya que deberia de ser una ruta, en caso de que no sea una ruta valida provocaria un error que saldria del programa. Os lo dejo como tarea de casa si queréis mejorar esta parte del código....





No hay comentarios:

Publicar un comentario