这段代码工作正常:
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事件处理程序到
单位实现部分或''text:string''在单位var部分中我得到错误:E2197常量对象不能作为var参数传递
根据文件:
当您出现此错误消息时 尝试将常量作为var或out发送 函数或过程的参数。
但我没有宣布文本为常数,为什么我得到这个错误?
编辑: @mason wheeler:我不明白为什么会这样做:
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;
我的第一个代码没有工作,因为我将文本声明为字符串,你说:'''编译器可能认为它是对类型的引用而不是变量'',而不是为什么编译器认为它不是对类型的引用而不是在这种情况下的变量?我很困惑 Edit2:我现在明白了什么是错的,但仍然有一个混乱,我没有使用和声明,那么为什么delphi会像对待我一样:
with
form1 do
text := 'blahblahblah';
这在delphi部分是错误的我的意思是delphi不应该让我们做text := 'blah'
但form1.text := blah;
或with form1 do text := 'blah';
我需要打开/关闭一些编译器设置我我在没有任何ide专家的情况下使用delphi 2010
答案 0 :(得分:4)
实际上,如果您在实现部分中声明Text
并在Timer1Timer(Sender: TObject)
中使用它,编译器会将Text视为Form1.Text
。
将文本名称更改为sText,它将起作用。
修改1:
因为Form1.Char
等表单没有属性/字段。
答案 1 :(得分:2)
这可能是名称混乱。 “Text”也是类型名称,是遗留文本文件类型。因此,如果您将变量声明在不同的范围内,编译器可能会认为它是对类型的引用而不是对变量的引用。尝试将其命名为其他内容,它应该可以正常工作。
答案 2 :(得分:1)
关于你的编辑#2:
这是面向对象编程的标准约定。在为对象编写方法时,代码被隐式解释为在对象的范围内。换句话说,每个对象方法都可以被视为隐藏在with self do
块中。