【问题标题】:Unobvious Delphi syntax error不明显的 Delphi 语法错误
【发布时间】:2014-04-25 13:27:39
【问题描述】:

我遇到了一些我无法解决的简单代码问题。我正在使用应用了所有更新的 Delphi 5。

我有这个代码块:

procedure TForm1.LoadBtnClick(Sender: TObject);
var
   s1, s2, s3 : Textfile;
   sa, sb, RString, SQLString : string;
begin
  with sourcequery do begin
     Close;
     SQL.Clear;
     SQL.Add('delete * from source');
     ExecSQL;
     Close;
     AssignFile(S2, 'c:\delphi programs\events\source1.txt');
     AssignFile(S1, 'c:\delphi programs\events\source2.txt');
     Reset(s2);
     Reset(s1);
     while not eof(s1) do begin
        readln(s1, RString);
        SQLString := 'insert into source1(f1, f2) values(';
        SQLstring := SQLString+ QuotedStr(copy(Rstring, 1, pos(chr(9), Rstring)-1))+', ';
        SQLString := SQLString+QuotedStr(copy(Rstring, pos(chr(9),Rstring)+1,length(Rstring)))+')';
        with sourcequery do begin
           close;
           SQL.Clear;
           SQL.Add(SQLString);
           ExecSQL;
        end;
     end;
  end;
end;

但是,当我尝试编译它时,它在这一行的“eof(”之后停止:

 while not eof(s1) do begin

带有“缺少运算符或分号”的错误消息。

尽我所能,我找不到任何错误 - 缺少运算符或分号。我已经注释掉了文件读取块,它编译得很好。我已经重新输入了很多次,以防有隐藏的特殊字符。到目前为止,这是除了标题信息之外的整个程序。

谁能发现这个愚蠢的错误?

【问题讨论】:

  • 您可能遇到了范围解析问题。请改用while not System.eof(s1)...
  • 这就是为什么你不应该使用with
  • "with" 是邪恶的,因为它使代码难以阅读。 IDE看不懂你的意思,下一个看代码的开发者也会吃亏。
  • “被认为有害” -- hallvards.blogspot.com/2004/08/…
  • 一个嵌套的?!?它燃烧!它燃烧!让它停下来!

标签: delphi text-files


【解决方案1】:

您的所有代码都包装在with sourcequery do begin 块中,因此首先检查该块中的任何标识符是否可以是sourcequery 的成员。显然,该变量有一个名为eof 的成员,它不是函数。编译器将 eof 名称绑定到该非函数,而不是您期望它绑定到的函数,因此当您尝试像函数一样使用它时会报错。

最好的解决办法是停止使用with。它会导致这样的问题,其中名称的明显范围与编译器看到的不匹配。它还会导致调试问题(因为调试器中存在一个长期存在的错误,它以您在此处所做的方式解释名称,而不是编译器解释它们的方式)。它也可能导致其他错误。如果您不喜欢一直输入sourcequery.xyz,那么您可以为sourcequery 创建一个不会占用太多空间的别名:

var
  sq: TypeOfSourceQuery;
begin
  sq := sourcequery;
  sq.Close;
  sq.SQL.Clear;
  ...

如果您真的不想使用该解决方案,那么您可以使用快速简便的解决方案,即将eof 名称与它所属的单元一起限定。在您的情况下,您希望在 System 单元中定义函数,因此更改您的代码以表明:

while not System.Eof(s1) do begin

【讨论】:

  • 罗布,谢谢。我打算删除程序顶部的 with 块,因为尽管我计划使用它,但无论如何都没有必要。如果出于技术原因不使用 with 块,我不介意不使用,尽管它们非常方便。
猜你喜欢
  • 2012-07-15
  • 2023-03-18
  • 2019-09-27
  • 2014-08-05
  • 2013-08-23
  • 2015-03-16
  • 1970-01-01
  • 2014-04-12
相关资源
最近更新 更多