1

Delphi 2007 と Delphi XE2 で HDC タイプ (デバイス コンテキスト ハンドル) を宣言する方法に違いはありますか。

D2007 では次のコードは正常に動作しますが、DXE2 では範囲チェック エラーが発生します。

Control.Parent.Perform(WM_PAINT, Integer(DC), 0);

D2007 でコードをステップ実行すると、DC (デバイス コンテキスト) の値は常に MaxInt よりも小さいように見えますが、DXE2 では DC の値は通常 MaxInt より大きくなります。

同じマシン (同じプロジェクト、同じコード、同じ OS) で実行すると、D2007 と DXE2 で DC の値が異なるのはなぜですか?

代わりに DC を WParam (符号なし整数だと思います) にキャストしても安全ですか?

4

2 に答える 2

3

あなたのキャストは、最新の Delphi バージョンでは正しくありません。の 2 番目のパラメーターは、XE2 では署名されていないものPerformとして型指定されます。WPARAMしたがって、キャストする場合は、にキャストする必要がありますWPARAM

DC32 ビット コードでは、キャストによって の大きな値が負の値として再解釈されます。次に、符号なしパラメーターに渡すと、範囲チェックエラーが発生します。64 ビット コードでは、キャストによってポインターが切り捨てられます。

ただし、とにかくキャストする必要はありません。それHDCUINT_PTRであり、そうであるからですWPARAM。キャストを削除するだけです:

Control.Parent.Perform(WM_PAINT, DC, 0);

Windows の型の定義は、従来、Delphi では多くのキーの型が正しく定義されていないため混乱していました。64 ビット Delphi コンパイラが導入されたとき、Embarcadero はその瞬間を選んでこれらのエラーを修正しました。

Delphi の古いバージョンでは、2 番目のパラメータWPARAMが署名されていたHDCが署名されていなかったため、キャストが必要でした。

于 2013-03-28T08:59:33.173 に答える
1

be carfull type integer is not WParam .. DC タイプを WParam タイプに変換する必要があります

 Control.Parent.Perform(WM_PAINT, WPARAM(DC), 0);
于 2013-03-28T10:40:35.103 に答える