传递var参数时获取“ E2197常量对象不能作为var参数传递”

Oma*_*bal 3 delphi error-handling

该代码可以正常工作:

procedure TForm2.Timer1Timer(Sender: TObject);
var
  Text: string;
begin  SetLength (Text,555);
  GetWindowText (getforegroundwindow, PChar (Text),555);
  Form2.gtListBox1.Items.Add (
    IntToStr (getforegroundwindow) + ': ' + Text);
end;
Run Code Online (Sandbox Code Playgroud)

但是当我放

var
  Text: string;
Run Code Online (Sandbox Code Playgroud)

从Timer1Timer事件处理程序到单元实现部分或单元var部分中的“文本:字符串”,我得到错误:E2197
根据文档,不能将常量对象作为var参数传递:

当您尝试将常量作为函数或过程的var或out参数发送时,会出现此错误消息。

但是我没有将文本声明为常量,那么为什么会出现此错误?
编辑: @梅森·惠勒:我不明白,为什么这工作:

implementation
{$R *.dfm}
 var 
 char :integer;//first of all why does delphi let me declare variable that is also a type name
procedure TForm2.Button1Click(Sender: TObject);
begin
char:=11; 
showmessage(IntToStr(char));
end;
Run Code Online (Sandbox Code Playgroud)

我的第一个代码无法正常工作,因为我将文本声明为字符串,您会说:“编译器可能认为它是对类型的引用,而不是对变量的引用”,为什么编译器不认为它是对类型的引用而不是对变量的引用在这种情况下的变量?我很困惑
Edit2:我现在明白了什么地方出了问题,但仍然有1个困惑,我没有使用with语句,然后为什么delphi会像对待我一样使用:

 with
      form1 do
       text := 'blahblahblah';
Run Code Online (Sandbox Code Playgroud)

这在delphi部分上是错误的,我的意思是delphi不应该让我们这样做text := 'blah'form1.text := blah;或者with form1 do text := 'blah';我是否需要打开/关闭某些编译器设置,我正在使用没有任何ide专家的delphi 2010

Bha*_*rat 5

实际上,如果Text在实现部分声明并使用它Timer1Timer(Sender: TObject),则编译器会将Text视为Form1.Text

将文本名称更改为sText即可。

编辑1:

因为没有像这样的表单的属性/字段Form1.Char

  • Omair,在您的类的祖先中声明的Text属性的作用域比您在函数的外部声明的Text变量更近,但作用域比函数的内部声明的更远。编译器绑定到最接近的任何东西。您可以通过“限定”名称来提示您想要的内容。对属性说“ Self.Text”,对全局变量说“ UnitName.Text”,对类型说“ System.Text”。 (3认同)
  • @Omair。范围,范围,范围!当您在Object的方法内部时,您将具有对Self的隐式范围,因此,如果为TForm1类定义了Text,则在任何TForm1方法中,Text都将解析为Self.Text。 ”(即您的“ Form1.Text”),除非它被更局部的作用域(如局部变量“ Text”)或“ with”内部掩盖。 (2认同)