Ошибка «Типы фактических и формальных параметров var должны быть одинаковыми» в процедуре - PullRequest
5 голосов
/ 10 декабря 2010

Я пытаюсь написать процедуру в Delphi. Эта процедура получает имя TControl дочернего элемента, а затем пытается изменить некоторые свойства. Но когда я пытаюсь это сделать, Delphi выдает ошибку вроде:

E2033 Типы фактических и формальных переменных параметры должны быть идентичны

Процедура:

procedure Change_prop(var Control: TControl;height:integer;width:integer);
begin
//......
end;

Пример использования: Change_prop(Label1, 50,200); Что может быть решением этой ошибки .. Спасибо.

Ответы [ 3 ]

9 голосов
/ 10 декабря 2010

Вам просто нужно удалить переменную в параметре Control и сделать его параметром значения. Поскольку объекты Delphi фактически реализованы как ссылочные типы, вы можете вызывать их методы, изменять поля элементов и т. Д., Даже если вы передаете их процедуре в качестве значения или параметра const.

5 голосов
/ 10 декабря 2010

Просто удалите var - вам не нужно менять свойства элемента управления:

procedure Change_prop(Control: TControl;height:integer;width:integer);
begin
......
end;
2 голосов
/ 10 декабря 2010

Как сказал Дэвид, проблема в 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;
...