我遇到一些简单的代码问题我根本无法解决。我正在使用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
带有“缺少运算符或分号”错误消息。
尽可能地尝试我找不到错误 - 缺少运算符或分号。我已经评论了文件读取块,它编译得很好。我已经多次重新输入,以防有隐藏的特殊字符。到目前为止,除了标题信息之外,这是整个程序。
有人能发现这个愚蠢的错误吗?
答案 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