Дельфи - Искать(); Процедура. Несовместимый тип

procedure ListMembers;
var
  Member, lMembers: string;
  lengthOfMember: Longint;
begin
  Writeln; 
  Writeln;
  Reset(FileA); //Only need read-only
  Reset(FileB); //Only need read-only
  while not Eof(FileA) do
    begin
      Readln(FileA, lMembers);
      Write(lMembers);
    end;
  Writeln(sLineBreak + sLineBreak);
  Write('Type the name of the member for more information: ');
  Readln(Member);
  lengthOfMember := Length(Member) + 2;
  Seek(FileB, lengthOfMember);
end;

У меня возникает проблема при попытке скомпилировать. Искать(); в последней строке возвращает ошибку несовместимого типа. Насколько я читал в Интернете, Seek принимает var: File и var: longint, поэтому я не понимаю, почему он считается плохим типом, поскольку я подаю ему файл и longint.

FileB был присвоен текстовому файлу в основном разделе кода. Эта часть просто процедура.

Цените любую помощь. Больше кода ниже.

program WoWProject;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
  TMember = record
  Name : string;
  Level : integer;
  CharClass : string;
  Role : string;
  Spec : string;
  DKP : integer;
end;

var
FileA, FileB : Textfile;

//THIS PART IS THE PROCEDURE ABOVE
//ANOTHER PROCEDURE HERE UNRELATED TO THIS
//ANOTHER HERE WHICH IS THE WELCOME PROCEDURE

//MAIN
begin
 Assign(FileA, 'CharacterNames.txt');
 Assign(FileB, 'CharacterInfo.txt');
 repeat
   Append(FileA);
   Append(FileB);
   Welcome;
 until 1=2
end.

person Astonix    schedule 06.08.2011    source источник
comment
Ошибка про несовместимый тип единственная или есть еще? Может ли быть так, что FileB не входит в область действия и из-за этого компилятор предполагает, что это целое число?   -  person ain    schedule 06.08.2011
comment
пожалуйста, опубликуйте полный код со всем, что определено. Не заставляйте нас гадать.   -  person David Heffernan    schedule 06.08.2011
comment
ain - Это единственная ошибка. Я думаю, это может быть потому, что Seek не любит текстовые файлы, верно? Текстовый файл также определен в глобальных переменных   -  person Astonix    schedule 06.08.2011
comment
Покажите нам объявление переменной FileB.   -  person Steve Mayne    schedule 06.08.2011
comment
Если вам нужно увидеть другие процедуры, дайте мне знать. Не хотел добавлять все это, так как это может сделать его довольно длинным. Остальные процедуры ошибок не дают.   -  person Astonix    schedule 06.08.2011
comment
@Astonix Подумай об этом. У вас есть синтаксическая ошибка в функции, которая принимает два параметра. Знание типа этих параметров имеет первостепенное значение.   -  person David Heffernan    schedule 06.08.2011
comment
@Astonix - прекрасное состояние until 1=2 :)   -  person    schedule 06.08.2011
comment
@daemon_x Я всегда пишу этот цикл как while True, который на самом деле выглядит как внешний цикл интегрирования времени в OrcaFlex!!!   -  person David Heffernan    schedule 06.08.2011


Ответы (3)


Документация описывает Seek() следующим образом:

Перемещает текущую позицию типизированного или нетипизированного файла в указанный компонент. Не используется с текстовыми файлами.

В этом и заключается ваша проблема.

person David Heffernan    schedule 06.08.2011
comment
Мало того, ваш первый фрагмент кода ничего не записывает в FileB, по крайней мере, насколько я вижу. Все вызовы writeln должны включать FileB. - person No'am Newman; 07.08.2011

Вы можете использовать эту процедуру:

PROCEDURE TextSeek(VAR F : TEXT ; POS : Cardinal);
  BEGIN
    WITH TTextRec(F) DO BEGIN
      BufPos:=0; BufEnd:=0;
      SetFilePointer(Handle,POS,NIL,FILE_BEGIN)
    END
  END;

Но учтите, что вышеизложенное предназначено только для ЧТЕНИЯ из файла. Если вы ЗАПИСЫВАЕТЕ файл, вы просто перезаписываете байты в файле, независимо от разрывов строк или нет (нет возможности «вставить» текст в существующий текстовый файл).

person HeartWare    schedule 07.08.2011

Определите тип RECORD и откройте файл как запись или TFileStream. Напишите свой код еще раз, а затем спросите. У вас есть много разных частей кода из... я не знаю.

Определите так (пример):

type
 TMember = record
  Name : string[50];
  Level : integer;
  CharClass : string[50];
  Role : string[50];
  Spec : string[50];
  DKP : integer;
 end;
 Member = file of TMember;
var
  FileA : file of TMember;

В этом случае вы должны ввести длину строк. И Seek будет работать так, как Вы пожелаете ;)

Вы можете изменить: с:

Seek(FileB, lengthOfMember); 

to:

Seek(FileB, length(Member)); 
person wcale    schedule 08.08.2011