|
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
|