sábado, 30 de julio de 2011

8.3 Añadiendo la función Copiar y Pegar del Portapapeles

Vamos a añadir dos nuevos procedimientos:
  • copiar el contenido del supergridviews en el portapapeles para pegarlo en una hoja de
    calculo (por ejemplo)
  • pegar el contenido del portapapeles en la tabla (por ejemplo una parte seleccionada de una hoja de calculo)

Abrimos el componente supergridviews y pegamos en la sección 4, el siguiente código:
'-----------------------------------------------------------------------
' codigo que genera copiar al portapapeles
'-----------------------------------------------------------------------
PUBLIC SUB copiaralportapapeles()
DIM texto AS String
DIM a AS Integer
DIM b AS Integer
IF ME.header = 1 OR ME.header = 3 THEN
FOR a = 0 TO ME.Columns.count - 1
texto &= ME.Columns[a].Title & "\t"
NEXT
texto &= "\n"
ENDIF
FOR a = 0 TO ME.Rows.Count - 1
FOR b = 0 TO ME.Columns.count - 1
texto &= revisa(ME[a, b].text) & "\t"
NEXT ' b
texto &= "\n"
NEXT 'a
Clipboard.Copy(texto)
Message.Info(("Copiado contenido al portapapeles"))
END
'revisa que el punto decimal lo convierta en la coma decimal
PRIVATE Function revisa(cadena AS String) AS String
DIM a AS Integer
DIM letra AS String
DIM devuelta AS String
DIM prueba AS Integer
'modificacion del anterior manual, ya que daba problema (se ha eliminado la parte que daba problema de esta funcion)
FOR a = 1 TO Len(cadena)
letra = Mid$(cadena, a, 1)
IF letra = "." THEN
letra = ","
ENDIF
devuelta &= letra
NEXT
RETURN devuelta
END

'-----------------------------------------------------------------------------
' codigo para pegar contenido del portapapeles al grid
'-----------------------------------------------------------------------------
PUBLIC SUB pegardelportapapeles()
'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
DIM titulos AS String
DIM respu AS String
DIM annadir AS Integer
DIM antiguotitulo AS String[]
finlinea = "\n" ' retorno de carro (separa las filas)
fincolumna = "\t" 'tabulador (separa las colunas)

respu = Message.Question(("¿Contiene titulos las columnas a pegar?"), "Si", "No")
IF respu = "1" THEN
titulos = -1
ELSE
IF respu = "2" THEN
titulos = 0
ELSE
'operacion cancelada
GOTO finleer
ENDIF
ENDIF
'titulos: 0: sin titulo, -1 titulo contiene la 1º fila

respu = Message.Question(("¿Desea sobreescribir los datos existentes?"), "Si", "No")

TRY portapapeles = Clipboard.paste()
TRY lineas = Split(portapapeles, finlinea)
TRY columnas = Split(lineas[0], fincolumna)

IF ERROR THEN
Message.Error(("error al leer columnas"))
GOTO finleer
ENDIF

IF respu = 1 THEN
annadir = 0
ELSE
annadir = ME.Rows.Count
ENDIF

IF TITULOS = -1 THEN ME.Rows.count = lineas.Count - 1 + annadir ' para sobreescribir
IF TITULOS = 0 THEN ME.Rows.count = lineas.Count + annadir ' para sobreescribir


linea_procesada = lineas[a]
columnas = Split(linea_procesada, fincolumna)
FOR c = 0 TO ME.Columns.count - 1
IF titulos = -1 THEN
ME.Columns[c].title = columnas[c]
ENDIF
IF titulos = 0 THEN
TRY ME[a + annadir, c].text = columnas[c]
IF ERROR THEN
Message.Error(("Producido un error al intentar pegar"))
GOTO finleer
ENDIF
ENDIF
NEXT

FOR a = 1 TO ME.Rows.count - 1
linea_procesada = lineas[a]
IF linea_procesada = "" THEN BREAK
columnas = Split(linea_procesada, fincolumna)

FOR c = 0 TO ME.columns.count - 1
ME[a + annadir + titulos, c].text = columnas[c]
finnext:
NEXT 'c
NEXT 'a
ME.Rows.count -= 1

'hemos pegado informacion, ya el gridvies esta desordenado
FOR a = 0 TO ME.Columns.count - 1
IF Mid$(ME.Columns[a].text, 1, 3) = "↓" OR Mid$(ME.Columns[a].text, 1, 3) = "↑" THEN
ME.Columns[a].Text = Mid$(ME.columns[a].text, 4, Len(ME.columns[a].text))
ENDIF
NEXT
'refrescamos el contenido de la tabla
ME.Refresh
colorear()
finleer:
END

Bien ahora vamos al proyecto “pruebacomponente”, para ver como funcionan las dos nuevas subrutinas:

Creamos dos botones en el formulario con el siguiente código: (uno con el texto “Copiar” y otro con el texto “Pegar”)
PUBLIC SUB Button2_Click()
supergridviews1.copiaralportapapeles()
END
PUBLIC SUB Button3_Click()
supergridviews1.pegardelportapapeles()
END



Quedaría una cosa así:





Al pulsar click sobre el botón copiar, nos saldrá





Si nos vamos a la hoja de calculo OpenOffice Calc y pulsamos “Pegar” (ctrl+v), nos saldrá este cuadro de diálogo:



















Y si le damos a aceptar, obtenemos:







Ahora haremos el caso contrario “pegar”, seleccionamos un trozo de la tabla,y pulsamos “copiar” (ctrl+c), en la hoja de cálculo.









Nos vamos a nuestro programa (pruebacomponente) y pulsamos en el botón “Pegar”, y nos saldrá el siguiente cuadro de diálogo:



En nuestro caso no tenemos los títulos y contestamos “No”


Ahora nos saldrá otro cuadro de diálogo:



Le vamos a decir que no, osea, que lo añada al contenido actual de la rejilla, pulsando el botón “No”

Ahora vemos lo que ha ocurrido, se han insertado las dos lineas seleccionadas



No hay comentarios:

Publicar un comentario en la entrada