クリップボードの解析というわけだけど、
やってることはクリップボードの内容を列挙してID、フォーマット名をリストアップするって言うこと。
まず、フォーマットには2種類あって、あらかじめ定義されているものと独自形式のものがある。
定義済みのはWindowsユニット辺りに定数が乗っているので、それを判定に用いればいいだけ。
一方、独自形式はどうやって判定するのかというと、GetClipBoardFormatNameというAPIを用いる。
これも多分Windowsユニットに定義されている。
APIの定義は以下の通り。
function GetClipboardFormatName(format: Cardinal; lpszFormatName: PAnsiChar; cchMaxCount: Integer): Integer;
引数を説明すると、
formatにはクリップボードのフォーマットを指定する。
具体的にはClipBoard.Formats配列の1つ。
lpszFormatNameにはフォーマット名を格納する変数を指定する。
cchMaxCountはlpszFormatNameのサイズを指定すればいい。
とりあえず具体的な例を示してみる。
uses節にClipBrdを追加、フォームとリストビューを1つで、
NameはそれぞれForm1、ListView1とし、
vsReport形式でキャプションにフォーマットID(16進数)、
SubItems[0]にフォーマット名を記入する。
procedure TForm1.ProcessClipBoard;
var
i: Integer;
NewItem: TListItem;
FormatID: Integer;
FormatName: array [0..MAX_PATH] of Char;
begin
//クリップボードの解析
for i := 0 to ClipBoard.FormatCount - 1 do
begin
FormatID:= ClipBoard.Formats[i];
NewItem:= ListView1.Items.Add;
case ClipBoard.Formats[i] of
CF_TEXT:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_TEXT');
end;
CF_BITMAP:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_BITMAP');
end;
CF_METAFILEPICT:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_METAFILEPICT');
end;
CF_SYLK:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_SYLK');
end;
CF_DIF:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_DIF');
end;
CF_TIFF:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_TIFF');
end;
CF_OEMTEXT:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_OEMTEXT');
end;
CF_DIB:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_DIB');
end;
CF_PALETTE:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_PALETTE');
end;
CF_PENDATA:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_PENDATA');
end;
CF_RIFF:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_RIFF');
end;
CF_WAVE:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_WAVE');
end;
CF_UNICODETEXT:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_UNICODETEXT');
end;
CF_ENHMETAFILE:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_ENHMETAFILE');
end;
CF_HDROP:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_HDROP');
end;
CF_LOCALE:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_LOCALE');
end;
CF_MAX:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_MAX');
end;
CF_MAX_XP:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_MAX_XP');
end;
CF_OWNERDISPLAY:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_OWNERDISPLAY');
end;
CF_DSPTEXT:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_DSPTEXT');
end;
CF_DSPBITMAP:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_DSPBITMAP');
end;
CF_DSPMETAFILEPICT:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_DSPMETAFILEPICT');
end;
CF_DSPENHMETAFILE:
begin
NewItem.Caption:= IntToHex(ClipBoard.Formats[i],4);
NewItem.SubItems.Add('CF_DSPENHMETAFILE');
end
else
begin
GetClipBoardFormatName(FormatID,FormatName,SizeOf(FormatName));
NewItem.Caption:= IntToHex(FormatID,4);
NewItem.SubItems.Add(FormatName);
end;
end;
end;
end;
For文でFormatの個数分だけ回し、Case文でフォーマットを判定する。
定義済みに当たったら定義済みのフォーマット名を列挙する。
なお、IDはIntToHex関数で桁数4で文字列に変換する。
そして、もし定義済みに当たらなかったらGetClipBoardFormatNameの出番。
以下には実行画面を示す。

TeraPadでコードの一部をコピーしたもの。
たかがテキストのコピーでも結構複雑なんだねぇ。