以下是我正在处理的文件预览系统项目的示例。主窗体上有两个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;
答案 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;