6

pracuję nad aplikacji VCL z Delphi 10 Seattle, i stworzył obsługi zdarzeń TDBGrid pośrednictwem IDE, kiedy zauważyłem, że Delphi dodaje atrybut Ref niestandardową dla Rect argumentu:Co robi [ref] w aplikacji VCL?

procedure TfrmXxx.yyyDrawColumnCell(Sender: TObject; 
    const [Ref] Rect: TRect; DataCol: Integer; Column: TColumn; 
    State: TGridDrawState); 
begin 
    // 
end; 
  • Kiedy lub dlaczego IDE decyduje się wstawić to?
  • Czy ma to jakiś wpływ w aplikacji VCL?

aktualizacja

Oto film dla tych, którzy nie mogą odtworzyć zachowanie: enter image description here

+0

Co do tego, kiedy Delphi zdecyduje się dodać go do obsługi zdarzeń: Zgaduję, kiedy podpis metody obsługi zdarzenia używa go. –

+0

Pamiętaj, że 'ref' nie ma nic wspólnego z VCL/FMX lub Intel/Arm. jeśli parametr jest oznaczony "const [ref]", oznacza to, że wskaźnik do tego parametru zostanie przekazany (tzn. przekazany przez odniesienie), a nie faktyczna wartość. – Johan

+0

@TOndrej: Nie widzę atrybutu w podpisie 'VCL.DBGrids.TDrawColumnCellEvent' ... –

Odpowiedz

6

jest ona wymieniona w docs:

stałe parametry mogą być przekazywane do funkcji według wartości lub przez odniesienie, w zależności od specyfikacji użyty kompilator. Aby zmusić kompilator do przekazania stałego parametru przez odniesienie, można użyć dekoratora [Ref] ze słowem kluczowym const.

Zobacz Constant Parameters

Kiedy albo dlaczego IDE decydowania o włożenie tego?

IDE nigdy nie wstawia tego. Po prostu kopiuje deklarację programu obsługi zdarzeń. Ten, kto napisał program obsługi zdarzeń, umieścił tam znacznik erespenu [ref].

Czy ma jakiś wpływ na aplikację VCL?

Tak.
Jeśli oznaczysz parametr 8-bajtowy jako const, zwykle zostanie on przekazany przez wartość w x64 i przekazany przez odniesienie w x86.
Zgłoszenie go jako const [ref] spowoduje wymuszenie przekazania go przez odniesienie w obu przypadkach.
Jest to bardzo przydatne podczas wykonywania wbudowanego zestawu i wielowątkowego kodu.
Przed wprowadzeniem const [ref] byliśmy zmuszeni użyć var zamiast const, aby osiągnąć ten sam efekt.

+0

Wielkość TRecta, która ma rozmiar 16 bajtów, prawdopodobnie zostałaby pominięta. – Johan

+0

IDE * nie * wstaw tego niestandardowego atrybutu podczas tworzenia procedury obsługi przez dwukrotne kliknięcie w inspektorze obiektów. Spróbuj. Samo zdarzenie jest zdefiniowane w następujący sposób: 'TDrawColumnCellEvent = procedure (Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState) obiektu; '(bez niestandardowego atrybutu). –

+0

Moim następnym przypuszczeniem jest, że kompilator win32 zawiera domyślnie atrybut [ref] w metodzie RTTI i to właśnie z niego pobierze IDE. –