代码之家  ›  专栏  ›  技术社区  ›  Omair Iqbal

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

  •  3
  • Omair Iqbal  · 技术社区  · 16 年前

    此代码工作正常:

    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;
    

    但是当我放

    var
      Text: string;
    

    从Timer1Timer事件处理程序到 Units var部分i get错误中的Units实现部分或“text:string”: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;
    

    我的第一个代码不起作用,因为我将文本声明为字符串,您会说:“编译器可能认为它是对类型的引用,而不是对变量的引用”,这比编译器为什么不认为它是对类型的引用,而不是在这种情况下对变量的引用呢?我很困惑
    编辑2: 我现在知道怎么了,但还是有一个困惑,我没有用 具有 声明,那么为什么Delphi将我视为使用:

     with
          form1 do
           text := 'blahblahblah';
    

    这是德尔福的错误,我是说德尔福不应该让我们这么做。 text := 'blah' 但是 form1.text := blah; with form1 do text := 'blah'; 我需要打开/关闭一些编译器设置吗?我在没有任何IDE专家的情况下使用Delphi2010

    3 回复  |  直到 16 年前
        1
  •  4
  •   Bharat    16 年前

    实际上,如果你申报 Text 在实现部分,并在 Timer1Timer(Sender: TObject) ,编译器将文本视为 Form1.Text .

    将文本名称更改为stext,它将起作用。

    编辑1:

    因为这样的窗体没有属性/字段 Form1.Char .

        2
  •  2
  •   Mason Wheeler    16 年前

    这可能是一个名字混淆。”文本”也是一个类型名,一个传统的文本文件类型。因此,如果您在不同的范围内声明变量,编译器可能会认为它是对类型的引用,而不是对变量的引用。试着给它命名一些其他的东西,它应该可以工作。

        3
  •  1
  •   Mason Wheeler    16 年前

    关于您的编辑2:

    这是面向对象编程的标准惯例。当您为对象编写方法时,代码被隐式地解释为在对象的范围内。换句话说,每个对象方法都可以被认为是隐藏在 with self do 块。