Помощь - Поиск - Пользователи - Календарь
Полная версия: вывод записей
Форум «Всё о Паскале» > 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



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