delphi 过程中的“实际和形式var参数的类型必须相同”错误

svgewumm  于 2023-06-29  发布在  其他
关注(0)|答案(4)|浏览(172)

我正在尝试用 Delphi 写一个程序。此过程获取TControl派生元素的名称,然后尝试更改某些属性。但是当我尝试这样做时, Delphi 给出了这样的错误:
E2033实际var参数和形式var参数的类型必须相同
程序:

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

使用示例:Change_prop(Label1, 50,200);什么可以解决这个错误...谢谢。

vsdwdz23

vsdwdz231#

您只需要删除Control参数中的var并使其成为值参数。因为 Delphi 对象实际上是作为引用类型实现的,所以你可以调用它们的方法,改变成员字段等。即使你将它们作为一个值或常量参数传递给一个过程。

cotxawn7

cotxawn72#

只需删除var-您不需要它来更改Control的属性:

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

jpfvwuh43#

就像大卫说的,问题在于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;
zengzsys

zengzsys4#

在我的例子中,当我们传递一个接口作为var参数时,会发生这种情况。
我找到了解决此问题的方法。
首先,有两个bug在一个:
1.编译器无法正确显示错误消息。这是因为项目被设置为外部编译(在MSBuild中)。一旦我将该选项设置为默认值,编译器就能够显示实际的错误消息和发生错误的代码行/单元。
1.我们的框架有接收接口作为var参数的方法。64位编译器不喜欢这样。解决方案是删除var参数OR以从变量中删除[unsafe]装饰器。
_

procedure DoStuff(var i: ISomeInterface);  // Fix a: Remove "var"   
begin   
   // DoStuff may set the I parameter to Nil!  
end;

这样使用:

var  
   [unsafe] x: ISomeInterface;     // Fix b: Remove [unsafe]   
DoStuff(x);

相关问题