IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> вывод записей
*оля*
сообщение 1.06.2010 8:27
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


помогите, пожалуйста, преобразовать процедуру:

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

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ка, а если записей больше нет, то при нажатии клавиши снова возвращались к первой десятке?

Сообщение отредактировано: *оля* - 1.06.2010 8:29
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 5)
volvo
сообщение 1.06.2010 9:07
Сообщение #2


Гость






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

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


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';

Набирал прямо здесь, так что могут быть огрехи, но основная идея - вот такая...
 К началу страницы 
+ Ответить 
*оля*
сообщение 1.06.2010 9:34
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


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

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


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

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

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


все работает)))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
*оля*
сообщение 1.06.2010 21:01
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


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

 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;

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.06.2010 21:26
Сообщение #5


Гость






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

P.S. Например, здесь: Record
 К началу страницы 
+ Ответить 
*оля*
сообщение 1.06.2010 22:11
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(volvo @ 1.06.2010 21:26) *

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

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



через поиск смотрела, но не нашла почему-то, а тут точно такая же задача, как надо, оказывается есть, спасибо!))))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.07.2025 9:26
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"