6

Ich bin mit Delphi 10 Seattle auf eine VCL-Anwendung zu arbeiten, und erstellt einen TDBGrid Ereignishandler über die IDE, als ich bemerkte, dass Delphi ein Ref benutzerdefinierten Attribute für das Rect Argument hinzugefügt:Was macht [ref] in einer VCL-Anwendung?

procedure TfrmXxx.yyyDrawColumnCell(Sender: TObject; 
    const [Ref] Rect: TRect; DataCol: Integer; Column: TColumn; 
    State: TGridDrawState); 
begin 
    // 
end; 
  • Wann oder Warum entscheidet sich die IDE dafür?
  • Hat es irgendwelche Auswirkungen in einer VCL App?

Update

Hier ist ein Video für diejenigen, die das Verhalten nicht reproduzieren können: enter image description here

+0

Wenn Delphi beschließt, es zu Ihrem Event-Handler hinzuzufügen: Ich würde raten, wenn die Signatur der Event-Handler-Methode es verwendet. –

+0

Beachten Sie, dass 'ref' nichts mit VCL/FMX oder Intel/Arm zu tun hat. Wenn ein Parameter mit const [ref] markiert ist, bedeutet dies lediglich, dass ein Zeiger auf diesen Parameter übergeben wird (d. h. als Referenz übergeben wird) und nicht der tatsächliche Wert. – Johan

+0

@TOndrej: Ich sehe das Attribut in der Signatur von 'VCL.DBGrids.TDrawColumnCellEvent' ... –

Antwort

6

Es wird in der Dokumentation erwähnt:

Konstante Parameter sein kann an die Funktion durch Wert oder durch Verweis, abhängig von der spezifischen übergeben ic-Compiler verwendet. Um zu erzwingen, dass der Compiler einen konstanten Parameter als Referenz übergibt, können Sie den Dekorator [Ref] mit dem Schlüsselwort const verwenden.

Siehe Constant Parameters

Wann oder warum die IDE entscheiden dies einfügen?

Die IDE fügt das nie ein. Es kopiert nur die Deklaration des Event-Handlers. Wer auch immer den Event-Handler geschrieben hat, setzt den Pass auf [ref].

Hat es irgendwelche Auswirkungen in einer VCL App?

Ja.
Wenn Sie einen 8-Byte-Parameter als const markieren, wird er normalerweise in x64 als Wert übergeben und als Referenz in x86 übergeben.
Wenn Sie es als const [ref] deklarieren, wird es in beiden Fällen als Referenz übergeben.
Es ist sehr nützlich, wenn Inline-Assembly und in Multi-Thread-Code.
Bevor const [ref] eingeführt wurde, waren wir gezwungen, var anstelle von const zu verwenden, um den gleichen Effekt zu erzielen.

+0

Das TRect, das 16 Bytes groß ist, würde wahrscheinlich sowieso durch ref übergeben werden. – Johan

+0

Die IDE * fügt * dieses benutzerdefinierte Attribut ein, wenn Sie den Handler durch Doppelklicken im Objektinspektor erstellen. Versuch es. Das Ereignis selbst ist wie folgt definiert: 'TDrawColumnCellEvent = procedure (Sender: TObject; const Rect: TRect; DataCol: Ganzzahl; Column: TColumn; State: TGridDrawState) des Objekts; '(ohne das benutzerdefinierte Attribut). –

+0

Meine nächste Vermutung wäre, dass der Win32-Compiler das [ref] -Attribut standardmäßig in der RTTI-Methode enthält und von wo die IDE es abruft. –