6

Sto lavorando su un'applicazione VCL con Delphi 10 Seattle, e ha creato un gestore di eventi TDBGrid tramite l'IDE quando ho notato che Delphi ha aggiunto un attributo Ref personalizzato per l'argomento Rect:Cosa fa [ref] in un'applicazione VCL?

procedure TfrmXxx.yyyDrawColumnCell(Sender: TObject; 
    const [Ref] Rect: TRect; DataCol: Integer; Column: TColumn; 
    State: TGridDrawState); 
begin 
    // 
end; 
  • Quando o perché l'IDE decide di inserirlo?
  • Ha qualche effetto in una app VCL?

aggiornamento

Ecco un video per coloro che non possono riprodurre il comportamento: enter image description here

+0

Per quando Delphi decide di aggiungerlo al gestore di eventi: indovinare quando la firma del metodo del gestore di eventi lo utilizza. –

+0

Si noti che 'ref' non ha nulla a che fare con VCL/FMX o Intel/Arm. se un parametro è marcato 'const [ref]' significa solo che un puntatore a quel parametro sarà passato (cioè passa per riferimento) e non il valore attuale. – Johan

+0

@TOndrej: Non vedo l'attributo nella firma di 'VCL.DBGrids.TDrawColumnCellEvent' ... –

risposta

6

E 'menzionato nei documenti:

parametri costanti possono essere passato alla funzione per valore o per riferimento, a seconda della specifica compilatore IC usato. Per forzare il compilatore a passare un parametro costante per riferimento, è possibile utilizzare il decoratore [Rif] con la parola chiave const.

Vedi Constant Parameters

quando o perché l'IDE decide di inserire questo?

L'IDE non inserisce mai questo. Copia semplicemente la dichiarazione del gestore eventi. Chiunque abbia scritto il gestore dell'evento ha inserito il passaggio entro il punto di riferimento [ref].

Ha qualche effetto in una app VCL?

Sì.
Se si contrassegna un parametro da 8 byte come const, verrà normalmente passato per il valore in x64 e passato per riferimento in x86.
Dichiarandolo come const [ref] lo forzerà per essere passato per riferimento in entrambi i casi.
È molto utile quando si esegue l'assemblaggio in linea e nel codice multi-thread.
Prima dell'introduzione di const [ref], siamo stati costretti a utilizzare var anziché const per ottenere lo stesso effetto.

+0

Probabilmente il TRect ha una dimensione di 16-byte, ma probabilmente sarebbe stato comunque superato. – Johan

+0

L'IDE * non * inserisce questo attributo personalizzato quando si crea il gestore facendo doppio clic nell'Ispettore oggetto. Provalo. L'evento stesso è definito in questo modo: 'TDrawColumnCellEvent = procedure (Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState) di object; '(senza l'attributo personalizzato). –

+0

La mia ipotesi successiva sarebbe che il compilatore win32 includa l'attributo [ref] nel metodo RTTI per impostazione predefinita e da lì l'IDE lo preleva. –