6

我正在與德爾福10西雅圖VCL應用程序,並通過創建IDE中的TDBGrid中的事件處理程序時,我注意到,德爾福添加爲Rect參數一個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編譯器。要強制編譯器通過引用傳遞常量參數,可以使用帶有const關鍵字的[Ref]裝飾器。

Constant Parameters

當或者爲何IDE決定插入這個?

IDE從不插入此內容。它只是複製事件處理程序的聲明。誰寫的事件處理程序把通過[ref] erence marker在那裏。

它是否對VCL應用程序有任何影響?

是的。
如果將8字節參數標記爲const,則它通常會按x64中的值傳遞,並在x86中通過引用傳遞。
聲明它爲const [ref]將在兩種情況下強制它通過引用傳遞。
這在執行內聯彙編和多線程代碼時非常有用。
在引入const [ref]之前,我們不得不使用var而不是const來達到相同的效果。

+0

大小爲16字節的TRect可能會被ref傳遞。 – Johan

+0

當您通過在對象檢查器中雙擊創建處理程序時,IDE *會插入此自定義屬性。嘗試一下。事件本身定義如下:'TDrawColumnCellEvent = procedure(Sender:TObject; const Rect:TRect; DataCol:Integer; Column:TColumn; State:TGridDrawState)object; '(沒有自定義屬性)。 –

+0

我的下一個猜測是,默認情況下,win32編譯器在方法RTTI中包含[ref]屬性,這就是IDE從中提取它的地方。 –