Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 视为常量的布尔属性_Delphi - Fatal编程技术网

Delphi 视为常量的布尔属性

Delphi 视为常量的布尔属性,delphi,Delphi,我有一个自定义组件,带有发布到对象检查器的TPersistent。该类由布尔属性填充,例如 type TMyClass = class(TPersistent) ... published property SomeBool: Boolean read FSomeBool write SetSomeBool; end; 然后,在这个组件之外的其他地方,我尝试使用一个子例程来写入这些属性,接受布尔值作为var参数: procedure LoadValues; proc

我有一个自定义组件,带有发布到对象检查器的
TPersistent
。该类由布尔属性填充,例如

type
  TMyClass = class(TPersistent)
  ...
  published
    property SomeBool: Boolean read FSomeBool write SetSomeBool;
  end;
然后,在这个组件之外的其他地方,我尝试使用一个子例程来写入这些属性,接受布尔值作为
var
参数:

procedure LoadValues;
  procedure CF(var AVal: Boolean);
  begin
    AVal:= False;
  end;
begin
  CF(MyComponent.MyClass.SomeBool);
  // ... repeated on 40 boolean properties in this class
end;
问题是它无法编译,告诉我:

E2197常量对象不能作为var参数传递

我到处找了找,找不出原因。其他人的解决方案是“使用常量,而不是var”。但这完全违背了我在这里要做的事情的目的。这个类中有40个布尔属性,我正在尝试合并将这些值分配给每个属性的一行


为什么会出现此错误,以及如何避免此错误?

我找到了解决此问题的方法。请注意,实际上,我并没有将它们全部分配给
False
——这只是一个示例。实际上,还有更多的内容可以指定每个值是真还是假

如注释中所述,
var
参数(当然)需要
变量
,而属性不符合条件。与其尝试将每个属性作为var参数传递,相反,子例程可以是一个函数,返回适当的布尔值:

procedure LoadValues;
  function CF: Boolean;
  begin
    Result:= False; //Or whatever value is needed
  end;
begin
  MyComponent.MyClass.SomeBool:= CF;
  // ... repeated on 40 boolean properties in this class
end;

var
参数需要一个变量——不能使用属性。原因是实际传递了指针。如果
FSomeBool
的可见性足够高,则可以执行
CF(MyComponent.MyClass.FSomeBool)
,但设置此设置后,显然不会调用setter。另外,您的目标仅仅是将所有布尔值初始化为
False
?如果是这样,您就什么也做不了,因为类成员总是被初始化为0、False、nil.。@AndreasRejbrand D'oh,这应该是常识。这个信息是误导性的,谈论的是“常量对象”。我找到了一个解决办法,将此子例程改为函数,返回要分配给每个属性的值。此外,我仅将其设置为
false
,作为一个示例,而实际上,当时我正在从其他地方读取。@Jerrydoge您说您正在更新40个布尔值属性,并且在代码中显示这些属性确实依赖于
setter方法
。这些
setter方法做什么?我为什么问这个?如果在
setter方法中
触发一些事件来通知数据已更改,或者执行一些其他代码来更新组件的状态,那么这可能会导致大量额外的处理。因此,您可能希望添加一种特殊的机制来大规模更新这些属性,而不触发通知或更新每个属性的状态,但只在最后这样做