Delphi - Seek (); Процедура. Несовместимый тип - PullRequest
2 голосов
/ 06 августа 2011
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.

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

Благодарим за любую помощь.Больше кода ниже.

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.

Ответы [ 3 ]

1 голос
/ 07 августа 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;

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

1 голос
/ 06 августа 2011

Документация описывает Seek() как:

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

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

0 голосов
/ 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(FileB, lengthOfMember); 

до:

Seek(FileB, length(Member)); 
...