6

私はデルファイ10、シアトルでのVCLアプリケーションに取り組んで、私はDelphiがRect引数にRefカスタム属性を追加したことに気づいたときにIDEを経由してのTDBGridのイベントハンドラを作成しています:[ref]はVCLアプリケーションで何をしますか?

procedure TfrmXxx.yyyDrawColumnCell(Sender: TObject; 
    const [Ref] Rect: TRect; DataCol: Integer; Column: TColumn; 
    State: TGridDrawState); 
begin 
    // 
end; 
  • かなぜIDEがこれを挿入するのですか?
  • VCLアプリケーションで効果がありますか?

更新

ここでの動作を再現することができない人のためのビデオだ: enter image description here

+0

Delphiをイベントハンドラに追加することを決定するときは、イベントハンドラメソッドのシグネチャが使用するタイミングを推測します。 –

+0

'ref'はVCL/FMXやIntel/Armとは関係がないことに注意してください。パラメータが 'const [ref]'とマークされている場合は、実際の値ではなく、そのパラメータへのポインタが渡される(つまり参照渡しされる)ことを意味します。 – Johan

+0

@TOndrej:「VCL.DBGrids.TDrawColumnCellEvent'の署名に属性が表示されません... –

答えて

6

これは、ドキュメントに記載されている:

定数パラメータであってもよいです指定に応じて、値または参照によって関数に渡されます。 icコンパイラが使用されています。コンパイラが参照によって定数パラメータを渡すようにするには、[Ref]デコレータをconstキーワードとともに使用します。

Constant Parameters

か、なぜIDEはこれを挿入することにしたんを参照してください?

IDEはこれを挿入しません。イベントハンドラの宣言をコピーするだけです。誰かがイベントハンドラを書いた人は、そこに[ref] erenceマーカーによるパスを入れました。

VCLアプリケーションで効果がありますか?

はい。
8バイトのパラメータをconstとしてマークすると、通常はx64の値で渡され、x86では参照渡しされます。
const [ref]と宣言すると、どちらの場合も参照渡しが強制されます。
インラインアセンブリやマルチスレッドコードを実行する場合に非常に便利です。
const [ref]が導入される前に、同じ効果を達成するためにconstの代わりにvarを使用するように強制されました。

+0

サイズが16バイトのTRectは、おそらくはrefで渡されるでしょう。 – Johan

+0

オブジェクトインスペクタでダブルクリックしてハンドラを作成すると、IDE *でこのカスタム属性が挿入されます。それを試してみてください。イベント自体は次のように定義されます。オブジェクトのTDrawColumnCellEvent = procedure(Sender:TObject; const Rect:TRect; DataCol:Integer;列:TColumn;状態:TGridDrawState) '(カスタム属性なし)。 –

+0

私の次の推測では、Win32コンパイラにはRTTIメソッドの[ref]属性がデフォルトで含まれていて、それはIDEがそれを引き出す場所です。 –

関連する問題