Помощь - Поиск - Пользователи - Календарь
Полная версия: вывод записей
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
*оля*
помогите, пожалуйста, преобразовать процедуру:

 // просмотр записей

procedure VivodRec;
begin
read(TFileOfTFileInfo, info);
With info do
begin
Write('запись номер ', FilePos(TFileOfTFileInfo), '  ');
writeln( name,' -- ', fio,' -- ', CreationDate);
end;
end;
//****************************************************
procedure VivodAllRecord;
begin
writeln('введите имя каталога');
read(Name);
if not ( FileExists(name)) then
    while not ( FileExists(name)) do begin
    writeln(' каталог с таким именем не существует. введите имя заново!');
    readln(name);
    end;
Assign(TFileOfTFileInfo,Name);
Reset(TFileOfTFileInfo);
Seek(TFileOfTFileInfo, 0); 
writeln('*** каталог', name, '***');
while (not Eof(TFileOfTFileInfo)) do
VivodRec;
close(TFileOfTFileInfo);
end;

.


в этой процедуре выводятся сразу все записи, а как сделать, чтобы они выводились,допустим, первая 10ка, при нажатии клавиши - следующая 10ка, а если записей больше нет, то при нажатии клавиши снова возвращались к первой десятке?
volvo
Цитата
а если записей больше нет, то при нажатии клавиши снова возвращались к первой десятке?
А как тогда выходить из этого вечного цикла?

Я бы сделал так:


procedure VivodRec(var f: <тип_файла>);
var info: <тип_записи>;
begin
  read(f, info);
  { и дальше выводишь данные, как и прежде }
end;

{ ... }

  Assign(TFileOfTFileInfo,Name);
  Repeat
    Reset(TFileOfTFileInfo);
    While not Eof(TFileOfTFileInfo) Do 
    Begin
      VivodRec(TFileOfTFileInfo);
      If (FilePos(TFileOfTFileInfo) mod 10 = 0) or (Eof(TFileOfTFileInfo)) Then 
      Begin
        Writeln('Нажмите Enter для продолжения...'); Readln;
      End;
    End;
    Write('Еще раз? (y/n)'); Readln(ans); { var ans: Char }
  Until Upcase(ans) = 'N';

Набирал прямо здесь, так что могут быть огрехи, но основная идея - вот такая...
*оля*
Цитата(volvo @ 1.06.2010 9:07) *

Я бы сделал так:...


так даже лучше, то, что надо, спасибо))))

Цитата(volvo @ 1.06.2010 9:07) *

Набирал прямо здесь, так что могут быть огрехи, но основная идея - вот такая...


все работает)))
*оля*
в продолжение темы "записи" возник такой вопрос: если у нас есть файл с записями, как добавить запись - понятно, а можно ли удалить запись и чтобы все записи, следующие за удаляемой переместились на одну позицию вверх?

 Procedure AddRecord;
begin
  Writeln('запись номер: ',FilePos(TFileOfTFileInfo)+1);
  with Struct do
  begin
    Write('введите имя файла с программой   ');
    Readln(Name);
    if not ( FileExists(name)) then
    while not ( FileExists(name)) do begin
    writeln(' Файл не существует. введите имя заново!');
    readln(name);
    end;
    Write('введите дату (образец: 22.05.10)    ');
    Readln(CreationDate);
    Write ('введите фамилию автора    ');
    ReadLn( Fio);
  end;
  Write(TFileOfTFileInfo,struct);
end;

// создание нового каталога ************************************

Procedure CreateRecordFile;
var
   i,count:integer;
begin
  Write('создание нового каталога! введите название ');
  Readln(NameFile);
  namefile:=namefile + '.txt';
  Assign(TFileOfTFileInfo,NameFile);
  Rewrite(TFileOfTFileInfo);
  Writeln('File created: ',NameFile);
  Write('введите количество записей ');
  Readln(count);
  for i:=1 to count do
      
AddRecord;
  Writeln('записано!');
  Close(TFileOfTFileInfo);
  clrscr;
end;

volvo
Чтобы удалить с сохранением порядка следования других записей - надо последовательно начиная с Rn+1 (где n - удаляемая запись) вручную передвигать все записи на одну "назад" (ближе к началу файла), а потом, когда будет последняя запись перемещена на место предпоследней - "отрезать" одну запись через Truncate... По-моему на форуме были примеры удаления записей из середины файла...

P.S. Например, здесь: Record
*оля*
Цитата(volvo @ 1.06.2010 21:26) *

Чтобы удалить с сохранением порядка следования других записей - надо последовательно начиная с Rn+1 (где n - удаляемая запись) вручную передвигать все записи на одну "назад" (ближе к началу файла), а потом, когда будет последняя запись перемещена на место предпоследней - "отрезать" одну запись через Truncate... По-моему на форуме были примеры удаления записей из середины файла...

P.S. Например, здесь: Record



через поиск смотрела, но не нашла почему-то, а тут точно такая же задача, как надо, оказывается есть, спасибо!))))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.