Home | Chi sono | Contattami
 

Progr. lineare

Delphi
 
Componenti
  Database
 
Miei articoli

Windows

Miei articoli 

 

Custom Clipboard Format


In questo articolo vediamo come usare la Clipboard per copiarci quello che ci pare e piace. La Clipboard è il magazzino di memoria usato per le operazioni di Copia e Incolla (Ctrl C e Ctrl V). La Clipboard contiene dati di un determinato formato: in pratica depositiamo il nostro blocco di dati e gli mettiamo una etichetta che ne rappresenta il formato; ad esempio CF_TEXT sta ad indicare che c'è del testo nella Clipboard. L'applicazione che eseguirà l'incolla (Paste) andrà ad incollare il contenuto presente nella Clipboard solo se tale contenuto ha un formato riconosciuto dall'applicazione stessa. Possono essere copiati nella Clipboard diversi oggetti contemporaneamente in diversi formati. Quindi la Clipboard rappresenta un semplice strumento per scambiare dati tra applicazioni o all'interno della stessa applicazione. E' da sottolineare che l'insieme delle applicazioni che si possono scambiare dati tramite Clipboard è limitato alle applicazioni che girano nella medesima Window Station in quanto vi è una Clipboard per ogni Window Station e che coinvolge appunto le applicazioni che girano in tale Window Station. Per maggiori delucidazioni sul concetto di Window Station si può far riferimento all'indirizzo

http://pasotech.altervista.org/delphi/articolo51.htm

Windows prevede un set di formati predefiniti, i cosiddetti Standard Clipboard Formats; tuttavia possono essere creati dei formati propri tramite l'api win32 RegisterClipboardFormat: si passa come parametro una stringa a nostra scelta e la funzione restituisce un valore Word identificativo del formato (valore compreso tra $C000 e $FFFF che va ad aggiungersi ai valori identificativi dei formati standard (CF_TEXT, CF_BITMAP, etc...)).

Per un'analisi dettagliata della Clipboard e più in generale del Copia&Incolla e Drag&Drop si può far riferimento all'articolo seguente

http://pasotech.altervista.org/delphi/articolo87.htm

L'articolo è abbastanza esteso e può essere indigesto.

Per capire in breve come intercettare le modifiche al contenuto della Clipboard si può far riferimento invece all'articolo

http://pasotech.altervista.org/delphi/articolo105.htm

In questo articolo voglio analizzare nello specifico in Copia&Incolla di qualsiasi tipo di dato: nello specifico vedremo come coinvolgere una struttura. Ho preso come riferimento un buon esempio da www.thedelphimagazine.com e l'ho leggermente modificato per farci un pò di pratica

la prima cosa da fare è registrare il nostro Custom Clipboard Format all'avvio; se il formato è già stato registrato allora la funzione restituirà semplicemente il valore del formato.   

var CB_CustomFormat: Word; ... procedure TFrmMain.FormCreate(Sender: TObject); begin CB_CustomFormat := RegisterClipboardFormat('4er5 - 432wqa sdr - 54MNJ UYHG'); end;

in Delphi la classe TClipboard ci consente di rendere Object Oriented la gestione della Clipboard. La copia di dati sulla clipboard viene definita in maniera chiara ed efficace proprio dall'implementazione del metodo TClipboard.SetBuffer

procedure TClipboard.SetBuffer(Format: Word; var Buffer; Size: Integer); var Data: THandle; DataPtr: Pointer; begin Open; try Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, Size); try DataPtr := GlobalLock(Data); try Move(Buffer, DataPtr^, Size); Adding; SetClipboardData(Format, Data); finally GlobalUnlock(Data); end; except GlobalFree(Data); raise; end; finally Close; end; end;

Partendo da questa implementazione è facile capire l'implementazione della Copia presente nell'esempio.

Per fare il Past (ossia l'incolla dei dati in un determinato formato dalla Clipboard) basta chiamare il metodo TClipboard.GetAsHandle (che fondamentalmente chiama l'api win32 GetClipboardData).

Di seguito l'esempio in esecuzione

Come appoggio useremo la seguente struttura

type TDataRecord = packed record Number1, Number2: Longint; Date1, Date2: TDateTime; AString: String[255]; end;

sarà questo il blocco di dati che andrò a copiare nella clipboard ettichettandolo col formato registrato in partenza.

Si compilano i dati nella sezione superiore , click su "Copy Data & Text" (copio nella Clipboard i valori digitati)  e poi click su "Past Data & Text" (copio dalla Clipboard): nella sezione sotto verranno visualizzati i dati sopra. Come si può notare dal testo dei pulsanti, le info vengono copiate nella Clipboard sia nel formato custom registrato all'avvio sia nel formato testo (CF_TEXT). Chiaramente funziona anche cross process: basta aprire 2 istanze del programma, compilare i dati nella sezione superiore nella prima istanza, fare "Copy Data & Text", passare alla seconda istanza, fare "Paste Data & Text" ed ecco che nella sezione sotto nella seconda istanza vedremo i dati.

ClipboardFormat.7z

 

 

 

 
 
Your Ad Here