Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


【Delphi】クリップボードを利用する

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' + #13 + 'EEEE' + #13 + '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)

 

 

(概要:ミガロ.情報マガジン「MIGARO News!!」Vol.102 2009年5月号より)
(SGへの貼付:ミガロ.情報マガジン「MIGARO News!!」Vol.103 2009年6月号より)
(※画像については新規書き下ろし)