Is it supposed to be possible for methods to be missing their arguments in the implementation?

Refresh

November 2018

Views

181 time

4

I face some common IDE bugs in Delphi XE2 (RAD Studio) but the problems themselves aren't my concern. It's the result of one of these bugs which made me stumble on something else.

Somehow, auto-completion decided to destroy a few methods of a form, so what used to be...

procedure TForm1.Button1Click(Sender: TObject);

in the implementation became something like...

procedure TForm1.Buproced(Sendure :);

(Not exact, but to some extent like that)

So, I had to manually fix these methods. However, I accidentally fixed one of them to...

procedure TForm1.Button1Click;

although it was supposed to have been...

procedure TForm1.Button1Click(Sender: TObject);

yet it still compiled and ran fine.

To test, start a new VCL Forms Application and drop just one TButton control, make an event handler for OnClick, and change its procedure to...

procedure TForm1.Button1Click;
var
  B: TButton;
begin
  B:= TButton(Sender);
  B.Caption:= 'Something';
end;

Is this supposed to be possible? Or is it perhaps an IDE and/or compiler bug?

2 answers

7

В Delphi можно опустить параметры в реализации. Это не ошибка, это особенность.

Правильный метод подписи оценивается декларации в интерфейсной секции.

2

Это намеренная и документирован особенность языка. Это часть документации , которая описывает эту функцию, с моим добавленным акцентом:

В то время как класс может быть объявлен в любом интерфейсе или секции реализации единицы, определяющие декларации за методы класса должна быть в секции реализации.

В заголовке определяющей декларации, имя методы всегда квалифицируется с именем класса , к которому он принадлежит. Заголовок может повторить список параметров из декларации класса ; если это произойдет, то порядок, тип и имена параметров должны точно соответствовать, и если метод является функцией, то возвращаемое значение должно соответствовать также.