2014-10-12 2 views
1

Ниже приведен пример из проекта системы предварительного просмотра файлов, над которым я работаю. В основной форме есть два списка. Первый, [lst_fileList], отображает список всех файлов «.txt» в каталоге [files], каждый из которых помечен [order ###. Txt], причем ### - любое число от 1 до 999. Когда процедура выполняется, он находит выбранный элемент в списке, (файл .txt), а затем отображает каждую отдельную строку из файла во втором ListBox [lst_filePreview].Ошибка Delphi: получил «нетипизированный», ожидаемый «AnsiString»

Хотя, когда я запускаю его, на 21-й строке в ReadLn (selectedFile) возникает ошибка. Состояние ошибки (Несовместимый тип: Got «нетипизированный», ожидаемый «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

В вопросе я вижу, он объявлен как "Textfile". –

ответ

6

Ваш код

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

пытается использовать ReadLn в качестве функции. Это не. Это, официально, процедура, которая похожа на функцию, возвращающую пустоту (нетипизированную). На самом деле, это процедура-компилятор-магия, и в зависимости от того, что она на самом деле пытается прочитать, компилятор вставляет вызовы к различным функциям или процедурам выполнения.

Вы можете избавиться от старых процедур Паскаля стиля в целом, и использование потоков вместо этого, но сейчас, попробуйте:

s: string 

    ... 

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

Пожалуйста, ознакомьтесь с Delphi DocWiki отмечает в Standard Routines and Input-Output, говоря:

Note: For new programs, you might want to use the File Management classes and functions in the System.Classes and System.SysUtils units. System.Classes.TStream and its descendent classes are currently recommended for general file handling in Delphi (for related routines, see Streams, Reader and Writers). For text-file handling, TStreamReader and TStreamWriter are recommended over calling Write and Writeln. API Categories Index contains lists of related routines and classes.

И если ваш lst_filePreview это на самом деле TListBox, вы даже можете сделать:

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

и сохраните весь код чтения. Я бы, вероятно, использовать TMemo вместо этого и сделать:

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

Да, это действительно работает. Большое спасибо. Я знал, что мне не хватает некоторых мелких деталей ... –

+1

Взгляните на мое редактирование: используйте LoadFromFile и избавьте себя от хлопот. –

+0

Аа, ничего себе! Еще раз спасибо, это намного проще. –

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; 
+0

Спасибо, это работает. –

Смежные вопросы