Saltar al contenido principal
Versión: Siguiente

APPEND DATA TO PASTEBOARD

APPEND DATA TO PASTEBOARD ( tipoDatos ; datos )

ParámetroTipoDescripción
tipoDatosTextTipo de datos (4 caracteres)
datosBlobDatos a añadir al portapapeles

Este comando no es hilo seguro, no puede ser utilizado en código apropiativo.

Descripción

El comando APPEND DATA TO PASTEBOARD añade en el portapapeles los datos del tipo especificado en tipoDatos en el BLOB datos.

Nota: en el caso de operaciones copiar/pegar, el contenedor de datos corresponde al Portapapeles.

Pase en tipoDatos un valor definiendo el tipo de datos a añadir. Puede pasar una firma 4D, un tipo UTI (Mac OS), un nombre/número de formato (Windows), o un tipo de 4 caracteres (compatibilidad). Para mayor información sobre estos tipos, consulte la sección .

Nota para los usuarios Windows: cuando el comando se utiliza con datos de tipo texto (tipoDatos dataType rs "TEXT", com.4d.private.text.native o com.4d.private.text.utf16), la cadena contenida en el parámetro BLOB datos debe terminar con el carácter NULL en Windows.

Si los datos del BLOB se añaden correctamente al portapapeles, la variable OK toma el valor 1. De lo contrario la variable OK toma el valor 0 y se puede generar un error.

Generalmente, se utiliza el comando APPEND DATA TO PASTEBOARD para agregar múltiples instancias de los mismos datos al portapapeles o para añadir datos que no son de tipo TEXT o PICT. Para añadir nuevos datos al portapapeles, primero debe limpiar el portapapeles utilizando el comando CLEAR PASTEBOARD.

Si quiere limpiar y añadir:

Sin embargo, note que si un BLOB contiene texto o una imagen, usted puede utilizar el comando APPEND DATA TO PASTEBOARD para añadir un texto o una imagen al portapapeles.

Ejemplo

Utilizando los comandos del tema portapapeles y de los BLOBs, puede construir esquemas sofisticados de Cortar/Copiar/Pegar para administrar datos estructurados en lugar de una sola pieza de información. En el siguiente ejemplo, los dos métodos de proyecto SET RECORD TO CLIPBOARD y GET RECORD FROM CLIPBOARD le permiten tratar un registro de una información a copiar en o desde el portapapeles.

  // Método de proyecto ENVIAR REGISTRO AL PORTAPAPELES
  // ENVIAR REGISTRO AL PORTAPAPELES ( Numérico )
  // ENVIAR REGISTRO AL PORTAPAPELES ( Número de tabla )
 
 var $1;$vlCampo;$vlTipoCampo : Integer
 var $vpTabla;$vpCampo : Pointer
 C_STRING(255;$vsDocNombre)
 var $vtRegistroDatos;$vtCampoDatos : Text
 var $vxRegistroDatos : Blob
 
  // Limpiar el portapapeles (estará vacío si no hay un registro actual)
 CLEAR PASTEBOARD
  // Obtener un puntero a la tabla cuyo número se pasa como parámetro
 $vpTabla:=Table($1)
  // Si hay un registro actual para esa tabla
 If((Record number($vpTabla->)>=0)|(Is new record($vpTabla->)))
  // Inicializar la variable texto que contendrá la imagen de texto del registro
    $vtRegistroDatos:=""
  // Para cada campo del registro:
    For($vlCampo;1;Count fields($1))
  // Obtener el tipo de campo
       GET FIELD PROPERTIES($1;$vlCamp;$vlCampoTipo)
  // Obtener un puntero hacia el campo
       $vpCampo:=Field($1;$vlCampo)
  // Dependiendo del tipo de campo, copiar (o no) sus datos de manera apropiada
       Case of
          :(($vlCampoTipo=Is alpha field)|($vlCampoTipo=Is text))
             $vtCampoDatos:=$vpCampo->
          :(($vlCampoTipo=Is real)|($vlCampoTipo=Is integer)|($vlCampoTipo=Is longint)|($vlCampoTipo=Is date)|($vlCampoTipo=Is time))
             $vtCampoDatos:=String($vpCampo->)
          :($vlCampoTipo=Is Boolean)
             $vtCampoDatos:=String(Num($vpCampo->);"Sí;;No")
          Else
  // Pasar e ignorar los otros tipos de campos
             $vtCampoDatos:=""
       End case
  // Acumular los datos del campo en una variable de texto que almacena la imagen de texto del registro
       $vtRegistroDatos:=$vtRegistroDatos+Field name($1;$vlCampo)+":"+Char(9)+$vtCampoDatos+CR
  // Nota: El método CR devuelve Char(13) en Macintosh y Char(13)+Char(10) en Windows
    End for
  // Colocar la imagen de texto del registro en el portapapeles
    SET TEXT TO PASTEBOARD($vtRegistroDatos)
  // Nombre del archivo scrap en la carpeta Temporales
    $vsDocNombre:=Temporary folder+"Scrap"+String(1+(Random%99))
  // Borrar el archivo scrap si existe (Se debe hacer una prueba de error aquí)
    DELETE DOCUMENT($vsDocNombre)
  // Crear archivo scrap
    SET CHANNEL(10;$vsDocNombre)
  //Enviar el registro completo al archivo scrap
    SEND RECORD($vpTabla->)
  // Cerrar el archivo scrap
    SET CHANNEL(11)
  // Cargar el archivo scrap en un BLOB
    DOCUMENT TO BLOB($vsDocNombre;$vxRegistroDatos)
  // No necesitamos más el archivo scrap
    DELETE DOCUMENT($vsDocNombre)
  // Añadir la imagen completa del registro al portapapeles
  // Nota: utilizamos arbitrariamente el tipo de datos "4Drc"
    APPEND DATA TO PASTEBOARD("4Drc";$vxRegistroDatos)
  // En este punto, el portapapeles contiene:
  // (1) Una imagen de texto del registro (como se muestra en las copias de pantalla a continuación)
  // (2) Una imagen completa del registro (incluyendo imágenes, subarchivos y los campos de tipo BLOB)
 End if

Al introducir el siguiente registro:

Si aplica el métodoENVIAR REGISTRO AL portapapeles a la tabla [Empleados], el portapapeles contendrá el texto del registro y la imagen completa del registro.

Puede pegar esta imagen del registro en otro registro, utilizando el método GET RECORD FROM CLIPBOARD, como se muestra a continuación:

  // Método OBTENER REGISTRO DESDE PORTAPAPELES
  // OBTENER REGISTRO DESDE PORTAPAPELES ( Número )
  // OBTENER REGISTRO DESDE PORTAPAPELES ( Número de tabla )
 var $1;$vlCampo;$vlCampoTipo;$vlPosCR;$vlPosColon : Integer
 var $vpTabla;$vpCampo : Pointer
 C_STRING(255;$vsDocNombre)
 var $vxPortapapelesDatos : Blob
 var $vtPortapapelesDatos;$vtCampoDatos : Text
 
  // Obtener un puntero hacia la tabla cuyo número se pasa como parámetro
 $vpTabla:=Table($1)
  // Si hay un registro actual
 If((Record number($vpTabla->)>=0)|(Is new record($vpTabla->)))
    Case of
  // ¿El portapapeles contiene una imagen completa del registro?
       :(Pasteboard data size("4Drc")>0)
  // Si es así, extraiga el contenido del portapapeles
          GET PASTEBOARD DATA("4Drc";$vxPortapapelesDatos)
  // Nombre para el archivo scrap en la carpeta temporales
          $vsDocNombre:=Temporary folder+"Scrap"+String(1+(Random%99))
  // Borrar el archivo scrap si existe (Se debe hacer una prueba de error aquí)
          DELETE DOCUMENT($vsDocNombre)
  // Guardar el BLOB en el archivo scrap
          BLOB TO DOCUMENT($vsDocNombre;$vxPortapapelesDatos)
  // Abrir el archivo scrap
          SET CHANNEL(10;$vsDocNombre)
  // Recibir el registro completo del archivo scrap
          RECEIVE RECORD($vpTable->)
  // Cerrar el archivo scrap
          SET CHANNEL(11)
  // No necesitamos más el archivo scrap
          DELETE DOCUMENT($vsDocNombre)
  // ¿El portapapeles contiene TEXT?
       :(Pasteboard data size("TEXT")>0)
  // Extraer el texto del portapapeles
          $vtPortapapelesDatos:=Get text from pasteboard
  // Inicializar el número de campos a incrementar
          $vlCampo:=0
          Repeat
  // Buscar la línea de campo siguiente en el texto
             $vlPosCR:=Position(CR;$vtPortapapelesDatos)
             If($vlPosCR>0)
  // Extraer la línea de campo
                $vtCampoDatos:=Substring($vtPortapapelesDatos;1;$vlPosCR-1)
  // Si hay dos puntos ":"
                $vlPosColon:=Position(":";$vtCampoDatos)
                If($vlPosColon>0)
  // Tomar sólo los datos de campo (eliminar el nombre de campo)
                   $vtCampoDatos:=Substring($vtCampoDatos;$vlPosColon+2)
                End if
  // Incrementar el número de campo
                $vlCampo:=$vlCampo+1
  // El portapapeles puede contener más información de la que necesitamos...
                If($vlCampo<=Count fields($vpTabla))
  // Obtener el tipo de campo
                   GET FIELD PROPERTIES($1;$vlCampo;$vlCampoTipo)
  // Obtener un puntero al campo
                   $vpCampo:=Field($1;$vlCampo)
  // Dependiendo del tipo de campo, copiar (o no) el texo de una manera apropiada
                   Case of
                      :(($vlCampoTipo=Is alpha field)|($vlCampoTipo=Is text))
                         $vpCampo->:=$vtCampoDatos
                      :(($vlCampoTipo=Is real)|($vlCampoTipo=Is integer)|($vlCampoTipo=Is longint))
                         $vpCampo->:=Num($vtCampoDatos)
                      :($vlCampoTipo=Is date)
                         $vpCampo->:=Date($vtCampoDatos)
                      :($vlCampoTipo=Is time)
                         $vpCampo->:=Time($vtCampoDatos)
                      :($vlCampoTipo=Is Boolean)
                         $vpCampo->:=($vtCampoDatos="Sí")
                      Else
  // Pasar e ignorar los otros tipos de datos de campos
                   End case
                Else
  // Todos los campos han sido asignados, salir del bucle
                   $vtPortapapelesDatos:=""
                End if
  // Eliminar el texto que acaba de ser extraído
                $vtPortapapelesDatos:=Substring($vtPortapapelesDatos;$vlPosCR+Length(CR))
             Else
  // No se encontró un delimitador, salir del bucle
                $vtPortapapelesDatos:=""
             End if
  // Repetir mientras tengamos datos
          Until(Length($vtPortapapelesDatos)=0)
       Else
          ALERT("El portapapeles no contiene datos que puedan pegarse como un registro.")
    End case
 End if

Variables y conjuntos del sistema

Si los datos en el BLOB se añaden correctamente al portapapeles, la variable sistema OK toma el valor 1; de lo contrario OK toma el valor 0 y se podría generar un error.

Ver también

CLEAR PASTEBOARD
SET PICTURE TO PASTEBOARD
SET TEXT TO PASTEBOARD