Excelからクリップボードにコピーした値をDelphiからいろいろなフォーマット(形式)で取り出す ~Delphiでお手軽プログラミング

Excelからクリップボードにコピーした値をDelphiからいろいろなフォーマット(形式)で取り出す ~Delphiでお手軽プログラミング

クリップボードにコピーしたとき、クリップボード内には様々なフォーマット(形式)で入っています。
Excelでシートのセル範囲をコピーし、Delphiから様々なフォーマット(テキスト、CSV、HTMLテキスト、ビットマップ)でクリップボードから取り出してみます。

プロジェクトの作成と画面設計

プロジェクトを新規作成(VCLアプリケーション)し、フォーム(Form1)にTButtonを1個、TMemoを4つ、TImageを1個を配置する。
Delphi IDE

ソースコードの記述

TButton1をダブルクリックして、以下ソースコードを記述する。
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    Memo4: TMemo;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses clipbrd;

procedure TForm1.Button1Click(Sender: TObject);
var CF_HTML,CF_CSV:Cardinal;
    h:NativeUInt;
    p:Pointer;
    size:NativeUint;
    st:string;
    i:integer;
    buf:array[0..350] of Char;
    bytes:TBytes;
begin
  if Clipboard.FormatCount=0 then
  begin
    Memo1.Clear;
    Memo1.Lines.Add('クリップボードは空っぽです');
    exit;
  end;

  //クリップボードの新しいデータ形式をWindowsシステムに登録する
  CF_HTML:=RegisterClipboardFormat('HTML Format');
  CF_CSV:=RegisterClipboardFormat('Csv');

  //クリップボード内の形式を列挙する
  Memo1.Clear;
  for i := 0 to Clipboard.FormatCount-1 do
  begin
    FillChar(buf,sizeof(buf),#0);
    GetClipboardFormatName(
      Clipboard.Formats[i],buf,sizeOf(buf)
    );
    Memo1.Lines.Add(
     IntToHex(Clipboard.Formats[i],4)+'('+
     IntToStr(Clipboard.Formats[i])+') '+
     WideCharToString(@buf[0])
    );
  end;

  //テキスト形式での取得
  Memo2.Clear;
  if Clipboard.HasFormat(CF_TEXT) then
  begin
    Memo2.Lines.Add(Clipboard.AsText);
  end;

  //ビットマップ形式での取得
  if Clipboard.HasFormat(CF_BITMAP) then
  begin
    Image1.Picture.Bitmap.Assign(Clipboard);
  end;

  //クリップボードを開く
  Clipboard.Open;

  //CSV形式での取得
  Memo3.Clear;
  h:=Clipboard.GetAsHandle(CF_CSV);
  if h<>0 then
  begin
    p:=Winapi.Windows.GlobalLock(h);
    if Assigned(p) then
    begin
      size:=GlobalSize(h);
      if size>0 then
      begin
        setlength(bytes,size);
        move(PByte(p)^,bytes[0],size);
        //クリップボードにShift-JISで入っている
        st:=TEncoding.Ansi.GetString(bytes);
        Memo3.Lines.Add(st);
      end;
    end;
    Winapi.Windows.GlobalUnlock(h);
  end;


  //HTML Format形式での取得
  Memo4.Clear;
  h:=Clipboard.GetAsHandle(CF_HTML);
  if h<>0 then
  begin
    p:=Winapi.Windows.GlobalLock(h);
    if Assigned(p) then
    begin
      size:=GlobalSize(h);
      if size>0 then
      begin
        setlength(bytes,size);
        move(PByte(p)^,bytes[0],size);
        //クリップボードにUTF-8で入っている
        st:=TEncoding.UTF8.GetString(bytes);
        Memo4.Lines.Add(st);
      end;
    end;
    Winapi.Windows.GlobalUnlock(h);
  end;


  //クリップボードを閉じる
  Clipboard.Close;
end;

end.

実行する

実行ボタンを押して実行します。(デバッグ実行でもOK)

Excelを起動してセル範囲を選択し、クリップボードにコピー(Ctrl+C)します。
Excelで範囲選択してコピー

Delphiで作成した実行中アプリで、Button1をクリックすると
が表示されます。
Excelのクリップボード内のデータを表示