Cómo realizar operaciones básicas del portapapeles (cortar, copiar, pegar) en Delphi

El Portapapeles de Windows representa el contenedor para cualquier texto o gráfico que se corte, copie o pegue desde o hacia una aplicación. Este artículo le mostrará cómo usar el objeto TClipboard para implementar las funciones de cortar-copiar-pegar en su aplicación Delphi.

 

Portapapeles en general

Como probablemente sabe, el Portapapeles sólo puede contener una pieza de datos para cortar, copiar y pegar a la vez. En general, sólo puede contener una pieza del mismo tipo de datos a la vez.

 

Si enviamos nueva información del mismo formato al Portapapeles, borramos lo que había antes. El contenido del Portapapeles permanece en el Portapapeles incluso después de pegarlo en otro programa.

TClipboard

Para utilizar el Portapapeles de Windows en nuestras aplicaciones, debemos añadir la unidad ClipBrd a la cláusula de usos del proyecto, excepto cuando restringimos el corte, copia y pegado a los componentes que tienen soporte incorporado para los métodos de Portapapeles. Estos componentes son TEdit, TMemo, TOLEContainer, TDDEServerItem, TDBEdit, TDBImage y TDBMemo.

 

La unidad ClipBrd instancia automáticamente un objeto TClipboard llamado Clipboard. Usaremos los métodos CutToClipboard, CopyToClipboard, PasteFromClipboard, Clear y HasFormat para tratar las operaciones del Portapapeles y la manipulación de texto/gráficos.

 

Enviar y recuperar texto

Para enviar texto al Portapapeles se utiliza la propiedad AsText del objeto Portapapeles.

 

Si queremos, por ejemplo, enviar la información de cadena contenida en la variable SomeStringData al Portapapeles (borrando cualquier texto que estuviera allí), usaremos el siguiente código:

 uses ClipBrd;

...

Clipboard.AsText := SomeStringData_Variable;

 

To retrieve the text information from the Clipboard we'll use

 

 uses ClipBrd;

...

SomeStringData_Variable := Clipboard.AsText;

 

Nota: si sólo queremos copiar el texto desde, digamos, Editar componente al Portapapeles, no tenemos que incluir la unidad ClipBrd en la cláusula de usos. El método CopyToClipboard de TEdit copia el texto seleccionado en el control de edición al Portapapeles en formato CF_TEXT.

 

 procedure TForm1.Button2Click(Sender: TObject) ;

begin

   //the following line will select    //ALL the text in the edit control    {Edit1.SelectAll;}

   Edit1.CopyToClipboard;

end;

Imágenes del Portapapeles

Para recuperar imágenes gráficas del Portapapeles, Delphi debe saber qué tipo de imagen está almacenada allí. Del mismo modo, para transferir imágenes al portapapeles, la aplicación debe indicar al portapapeles qué tipo de gráficos está enviando. A continuación, se presentan algunos de los posibles valores del parámetro Formato; existen muchos más formatos de portapapeles proporcionados por Windows.

 

  • CF_TEXT - Texto con cada línea que termina con una combinación CR-LF.
  • CF_BITMAP - Un gráfico de mapa de bits de Windows.
  • CF_METAFILEPICT - Un gráfico de metafile de Windows.
  • CF_PICTURE - Un objeto del tipo TPicture.
  • CF_OBJECT - Cualquier objeto persistente.

 

El método HasFormat devuelve True si la imagen en el Portapapeles tiene el formato correcto:

 

 if Clipboard.HasFormat(CF_METAFILEPICT) then ShowMessage('Clipboard has metafile') ;

 

Para enviar (asignar) una imagen al Portapapeles, utilizamos el método Assign. Por ejemplo, el siguiente código copia el mapa de bits de un objeto de mapa de bits llamado MyBitmap al Portapapeles:

 

 Clipboard.Assign(MyBitmap) ;

En general, MyBitmap es un objeto de tipo TGraphics, TBitmap, TMetafile o TPicture.

 

Para recuperar una imagen del Portapapeles tenemos que: verificar el formato del contenido actual del portapapeles y usar el método Assign del objeto de destino:

 

 {place one button and one image control on form1} {Prior to executing this code press Alt-PrintScreen key combination}

uses clipbrd;

...

procedure TForm1.Button1Click(Sender: TObject) ;

begin

if Clipboard.HasFormat(CF_BITMAP) then Image1.Picture.Bitmap.Assign(Clipboard) ;

end;

 

Más control del portapapeles

El Portapapeles almacena información en múltiples formatos para que podamos transferir datos entre aplicaciones que usan diferentes formatos.

 

Cuando leemos información del portapapeles con la clase TClipboard de Delphi, nos limitamos a los formatos estándar del portapapeles: texto, imágenes y metaficheros.

Supongamos que tenemos dos aplicaciones Delphi diferentes en ejecución, ¿qué opina acerca de definir un formato de portapapeles personalizado para enviar y recibir datos entre esos dos programas? Supongamos que estamos intentando codificar un elemento del menú Pegar - queremos que esté deshabilitado cuando no haya, digamos, texto en el portapapeles. Dado que todo el proceso con el portapapeles tiene lugar entre bastidores, no hay ningún método de clase TClipboard que nos informe de que ha habido algún cambio en el contenido del portapapeles. Lo que necesitamos es enganchar el sistema de notificación del portapapeles, para que podamos obtener y responder a los eventos cuando el portapapeles cambie.

 

Si queremos más flexibilidad y funcionalidad, tenemos que ocuparnos de las notificaciones de cambio de portapapeles y de los formatos de portapapeles personalizados: Escuchar el Portapapeles.

(0 votes)