The Delphi Bug List

Entry No.
493
VCL - 一般 - クリップボード - TClipboard
TClipboard.HasFormat は word 型の引数を取るように定義されているが、これは(符号無し) 32 ビット整数でなければならない
1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 4.03 5.0 5.01 6.0 6.01 6.02 Kylix 1.0
Absent Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha N/A
解説
Reported by Brad Stowers; checked by Reinier Sterkenburg
このバグはおそらく何も問題を起こさないでしょう。下のコメントを参照してください。
Win32 API 関数の IsClipboardFormatAvailable と RegisterClipboardFormat は、ともに UINT (D2 と D3 では Integer 、D4 では LongWord。どちらの場合も 16 ビット値ではなく 32 ビット値を取ります)を使用します。

VCL 関数には間違った引数(16 ビット)が渡されているので、これはバグです。独自のクリップボードフォーマットを登録した場合、関数は 32 ビット値を返しますが、それは 16 ビットに収まりません。そのため値は切り捨てられ、関数は間違って False を返すでしょう。

Comment by Chris Jobson:
IsClipboardFormatAvailable と RegisterClipboardFormat とが UINT を使用するのは確かですが、実際にはクリップボードフォーマットは常に 16 ビット値です。そのため、私は TClipboard.HasFormat を使用して問題になることがあるとは思いません。

MSDN ドキュメントの RegisterClipboardFormat の項には、"登録済みクリップボードフォーマットは 0xC000 〜 0xFFFF の範囲の値によって識別されます" と書かれています。それに、他のいくつかの Win32 API は、クリップボードフォーマットを 16 ビット値として扱っています(例えば、WM_DDE_ADVISE メッセージと共に使用される DDEADVISE 構造体は、クリップボードフォーマットを "short" として保存します)。ここでの真の問題は、マイクロソフトの API が一貫していないことだと思います!
解決策 / 回避方法
何も必要ありません。おそらく何の問題のないでしょう。
Latest update of this entry: 1998-10-28
本家 The Delphi Bug List のエントリーはこちら
The Delphi Bug List 日本語訳 へ