TEditやTMemoでは入力時にテキストのコピーや貼り付けなどが可能ですが、
これはクリップボードを利用して行われます。
このクリップボードを利用するために、TEditやTMemoには
CopyToClipboardやPasteFromClipboardといったメソッドが用意されています。
<参考>
CopyToClipboard ⇒ 選択部分をクリップボードにコピー
CutToClipboard ⇒ 選択部分をクリップボードに切り取り
PasteFromClipboard ⇒ クリップボードから貼り付け
※これらの処理にはuses節へのユニット追加は不要。
しかし、別の方法としてDelphiには
クリップボードを操作するためのClipboardオブジェクトがあります。
これを使うことで、メソッドがない場合や細かな制御にも対応できます。
Clipboardオブジェクトを利用するには、
uses節に「Vcl.Clipbrd」を追加します。(XE以前は「Clipbrd」)
クリップボードの内容をセットするには以下のようになります。
procedure TForm1.Button1Click(Sender: TObject);
begin
Clipboard.AsText := 'AAAA' + 'BBBB' + 'CCCC';
end;
これをExcelでひとつのセルに貼り付けた場合には、
そのセル値に『AAAABBBBCCCC』の文字が入ります。
これを同じ動作で3つのセルに分けるには、セルの区切りとなるタブ文字(#9)を挿入します。
Clipboard.AsText := 'AAAA' + #9 + 'BBBB' + #9 + 'CCCC';
改行を行う場合には、改行文字(#13)を挿入します。
Clipboard.AsText := 'AAAA' + #9 + 'BBBB' + #9 + 'CCCC' + #13
+ 'DDDD' + #9 + 'EEEE' + #9 + 'FFFF';
この方法によって、グリッドに表示した値なども
クリップボードに書き込むことができます。
逆にExcelからクリップボードにコピーした内容を
DelphiのStringGridに設定する場合は、以下のように記述します。
Excelからクリップボードに取り込まれた内容は
セルの区切りとしてTab、行の最後にCRLFが付加されています。
このためStringGridに貼り付ける場合には、
それによってカラムを右へ、または行を下へと移動させていきます。
procedure TForm1.Button2Click(Sender: TObject);
const
Tab = #9;
CR = #13;
LF = #10;
var
S, Subs : string;
Cols : integer;
Rows : integer;
i : integer;
begin
// クリップボードの内容を取り込む
// ※クリップボードにExcelからコピーしたセルが既に入っている前提
S := Clipboard.AsText;
// 初期設定
Rows := 1;
Cols := 1;
Subs := '';
// 文字によって処理
for i := 1 to Length(S) do
case S[i] of
Tab :
begin
if (Cols >= StringGrid1.ColCount) then
StringGrid1.ColCount := Cols + 1;
if (Rows >= StringGrid1.RowCount) then
StringGrid1.RowCount := Rows + 1;
StringGrid1.Cells[Cols, Rows] := Subs;
Inc(Cols);
Subs := '';
end;
CR :
begin
if (Cols >= StringGrid1.ColCount) then
StringGrid1.ColCount := Cols + 1;
if (Rows >= StringGrid1.RowCount) then
StringGrid1.RowCount := Rows + 1;
StringGrid1.Cells[Cols, Rows] := Subs;
Cols := 1;
Inc(Rows);
Subs := '';
end;
LF : ; // 処理なし
// Tab・CRLF以外
else
begin
Subs := Subs + S[i];
end;
end;
end;
end;
これらの注意点としては、以下のポイントがあります。
まずクリップボードはPC全体で使用するものであるため、
他のアプリケーション等でクリップボードが同時に使用されていると
処理に失敗するリスクがあります。
また、クリップボードを使い終わっても、セットされた内容はPCのメモリに残り続けます。
クリップボードをクリアする場合は、Clearメソッドを呼び出します。
Clipboard.Clear;
DelphiのClipboardオブジェクトでは、
文字列以外にもビットマップ等の画像データも扱うことが可能です。
たとえばTImage(Image1)のPictureをクリップボード経由で
別のTImage(Image2)のPictureに貼り付けるには、以下のように記述します。
procedure TForm1.Button3Click(Sender: TObject);
var
Bitmap: TBitmap;
begin
// クリップボードに画像をコピー
Clipboard.Assign(Image1.Picture);
// クリップボードにビットマップが入っているかチェック
if Clipboard.HasFormat(CF_BITMAP) then
begin // 入っていれば、Image2にペースト
Image2.Picture.Bitmap.Assign(Clipboard);
end;
end;
<参考リンク>(Embarcadero Docwiki)
- テキストの切り取り,コピー,貼り付け – RAD Studio
- グラフィックとのクリップボードの利用 – RAD Studio
- Vcl.Clipbrd.TClipboard – RAD Studio API Documentation
- Vcl.Clipbrd.TClipboard.HasFormat – RAD Studio API Documentation
(概要:ミガロ.情報マガジン「MIGARO News!!」Vol.102 2009年5月号より)
(SGへの貼付:ミガロ.情報マガジン「MIGARO News!!」Vol.103 2009年6月号より)
(※画像については新規書き下ろし)