1

最近、複雑なバグをデバッグしていました。Form.Handle存在しない(ガベージ ポインター)にアクセスしたことが原因でした。このバグは、私にとってかなり予想外の方法で明らかになりました。フォームにアクセスするHandleと、サイズ変更と再描画が発生しました。

ガベージ ポインターによるアクセスForm.Handleは、ガベージ THandle を返すだけだと思います。Handleがフォームの作成時に一度作成され、フォームが破棄されるまで同じままであることを期待しています。

質問

なぜそうなのか、それTForm.Handleはフォームの作成時に初期化され、経由でアクセスされるフィールドではありません

property Handle: Integer read FHandle;

、しかしゲッターです

property Handle: Integer read GetHandle;

CreateWnd最初のアクセス時にハンドルとウィンドウ()さえ作成しますか?

4

1 に答える 1

9

基盤となる OSウィンドウが存在しない場合でも、フォームオブジェクトは存在できます。この間、フィールドは 0 になり、有効なウィンドウ ハンドルを必要とするコードには役に立ちません。有効なハンドルが必要になるたびに確実に取得するには、フィールドを参照する前に呼び出す必要があります。ゲッターを持つプロパティとして、プロパティは自動的に呼び出すことができるため、プロパティを簡単に使用できます。HandleHandleNeededHandleHandleNeededHandle

于 2016-06-03T12:33:52.783 に答える