Delphi错误:得到“无类型”,预期“AnsiString”

时间:2014-10-12 13:52:44

标签: delphi compiler-errors pascal var lazarus

以下是我正在处理的文件预览系统项目的示例。主窗体上有两个ListBox。第一个,[lst_fileList],显示所有" .txt"的列表。目录[files]中的文件,每个都标有[order ###。txt],###是1到999之间的任意数字。当程序运行时,它会在列表框中找到所选项目,(a。 txt文件),然后在第二个ListBox [lst_filePreview]上显示文件中的每一行。

虽然在运行时,ReadLn(selectedFile)的第21行发生错误。错误状态(不兼容类型:得到"无类型",预期" AnsiString")。

我已经看了几个小时这个错误,但没有用...任何帮助将不胜感激,谢谢。


procedure TForm1.btn_getPreviewClick(Sender: TObject);
var
  checkSelect:integer;
  orderSelect:string;
  i:integer;
  selectedFile:textFile;
begin
  if lst_fileList.SelCount > 0 then
  begin
    for checkSelect:= 0 to (lst_fileList.Items.Count - 1) do
    if lst_fileList.Selected [checkSelect] then
    begin
      orderSelect:=lst_fileList.Items[checkSelect];
      orderSelect:=RightStr(orderSelect,3);
      if fileexists('files\order'+orderSelect+'.txt') then
      begin
        assignFile(selectedFile,'files\order'+orderSelect+'.txt');
        reset(selectedFile);
        while not EOF(selectedFile) do
        begin
          lst_filePreview.Items.Add(readLn(selectedFile));    // Error occurs here: //
        end;
        closeFile(selectedFile);
      end;
    end;
  end else
  ShowMessage('Please select an item first!');
end;

2 个答案:

答案 0 :(得分:6)

您的代码

  lst_filePreview.Items.Add(readLn(selectedFile));

尝试将Readln用作函数。它不是。它正式是一个过程,就像一个返回void的函数(无类型)。实际上,它是一个编译器魔术过程,并且根据它实际尝试读取的内容,编译器会将调用插入到不同的运行时函数或过程中。

您可能希望完全摆脱旧的Pascal式例程,而是使用流,但是现在,请尝试:

  s: string

  ...

  Readln(selectedFile, s);
  lst_filePreview.Items.Add(s);

请阅读Standard Routines and Input-Output上的Delphi DocWiki说明,并说:

  

注意:对于新程序,您可能希望使用文件管理   System.Classes和System.SysUtils单元中的类和函数。   System.Classes.TStream及其后代类目前是   推荐用于Delphi中的一般文件处理(用于相关例程,   见Streams,Reader和Writers)。对于文本文件处理,   建议使用TStreamReader和TStreamWriter而不是调用Write和   Writeln。 API类别索引包含相关例程和列表   类。

如果您的lst_filePreview实际上是TListBox,您甚至可以这样做:

lst_filePreview.Items.LoadFromFile('files\order'+orderSelect+'.txt');

并保存整个阅读代码。我可能会使用TMemo而不是:

FilePreviewMemo.Lines.LoadFromFile('files\order'+orderSelect+'.txt');

答案 1 :(得分:2)

使用Readln,您需要使用变量。

试试这个:

var
 checkSelect:integer;
 orderSelect:string;
 i:integer;
 selectedFile:textFile;
 SelectedLine : String;
begin
  if lst_fileList.SelCount > 0 then
  begin
    for checkSelect:= 0 to (lst_fileList.Items.Count - 1) do
    if lst_fileList.Selected [checkSelect] then
    begin
       orderSelect:=lst_fileList.Items[checkSelect];
       orderSelect:=RightStr(orderSelect,3);
       if fileexists('files\order'+orderSelect+'.txt') then
       begin
          assignFile(selectedFile,'files\order'+orderSelect+'.txt');
          reset(selectedFile);
          while not EOF(selectedFile) do
          begin
            readLn(selectedFile, SelectedLine )
            lst_filePreview.Items.Add( SelectedLine);// Error occurs here:         
          end;
         closeFile(selectedFile);
         end;
         end;
       end else
       ShowMessage('Please select an item first!');
       end;