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 が一貫していないことだと思います!
|
|
解決策 / 回避方法
|
何も必要ありません。おそらく何の問題のないでしょう。
|
|