Как сказал Дэвид, проблема в var .Это не означает, что вы можете изменять члены TControl, это означает, что вы можете заменить TControl другим, совершенно другим TControl, потому что объекты являются ссылочными типами.
Если вы 'Для передачи объекта параметру var передаваемая переменная должна быть объявлена точно такого же типа, что и параметр, чтобы сохранить безопасность типов.В противном случае вы можете сделать это:
procedure TForm1.VarControl(var control: TControl);
begin
control := TButton.Create;
end;
procedure TForm1.Mistake;
begin
VarControl(self.Memo1); //defined as TMemo
Memo1.Lines.Text := 'Undefined behavior here...';
end;