不明显的Delphi语法错误

时间:2014-04-25 13:27:40

标签: delphi text-files

我遇到一些简单的代码问题我根本无法解决。我正在使用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

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

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

有人能发现这个愚蠢的错误吗?

1 个答案:

答案 0 :(得分:8)

所有代码都包含在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