Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_Delphi_Ч2.doc
Скачиваний:
15
Добавлен:
02.11.2018
Размер:
1.7 Mб
Скачать

Удаление записи по фамилии

Эта процедура должна быть связана с пунктом меню «Удаление записи по фамилии».

//Удалить запись из файла

procedure TfrmAtt.mnuDelFamClick(Sender: TObject);

var fam: TName; r: TAttRec; f: TAttFile; pos: integer; ok :boolean;

begin

fam:=inputBox('Удаление записи из файла','Введите фамилию','');

// Открываем файл

openAttFile(f);

ok := false; // Признак того, что нужная запись найдена

// Организуем цикл по записям файла

while not eof(f) do

begin

// Читаем запись

read(f,r);

if r.Name = fam then begin

// Нашли нужную

ok := true;

// Запоминаем номер найденной записи (она уже предыдущая)

pos := filePos(f) - 1;

//читаем последнюю запись

seek(f,FileSize(f)-1);

read(f,r);

//Записываем последнюю на место удаляемой

seek(f,pos);

write(f,r);

//удаляем последнюю

seek(f,FileSize(f)-1);

truncate(f);

showMessage('Запись удалена ');

// Выводим измененный файл в StringGrid2

showFileInGrid(f,StringGrid2);

end;

end;

if not ok then showMessage(fam+' не найдено');

closeFile(f);

end;

Сохранение файла под другим именем

Эта процедура должна быть связана с пунктом меню «Сохранение файла под другим именем».

// Сохранение файла под другим именем

procedure TfrmAtt.mnuSaveAsClick(Sender: TObject);

var f1,f2:TAttFile; r:TAttRec; f2Name:String;

begin

// Запрашиваем через SaveDialog новое имя файла для сохранения

if SaveDialog.Execute then

begin

// Новое имя файла

f2Name := SaveDialog.FileName;

// Открываем файл в который будем переписывать

AssignFile(f2, f2Name);

Rewrite(f2);

// Открываем файл, имя которого записано в EditFileName

openAttFile(f1);

// Цикл копирования записей из f1 в f2

while not eof(f1) do begin

read(f1,r);

write(f2,r);

end;

CloseFile(f2);

CloseFile(f1);

ShowMessage('Файл скопирован в ' + f2Name);

end;

end;

      1. Процедуры для работы с упорядоченными файлами Процедура сортировки файла

Алгоритмы сортировки файлов подобны алгоритмам сортировки массивов. Но особенность состоит в том, что при обращении к нужной записи в файле приходится вызывать процедуру seek(), кроме того, приходится учитывать, что файловая позиция смещается после выполнения операции чтения или записи.

Ниже приведена процедура пузырьковой сортировки по фамилии студента для открытого файла записей с результатами аттестации. Так как сортировку записей можно производить и по другим признакам, например, по баллу, но в этом случае в процедуре нужно заменить выражение для сравнения записей.

Внешний цикл сортировки такой же, как и для массива, а во внутреннем цикле последовательно считываются две записи файла и сравниваются. Если порядок их следования нарушен, они записываются в обратном порядке.

//Пузырьковая сортировка файла по фамилии студента

procedure sortAttFile(var f: TAttFile);

var i, k: integer; ri1, ri2: TAttRec; ok: boolean;

begin

k := FileSize(f)-1;

repeat

ok := true;

k := k - 1;

for i := 0 to k do

begin

//Переходим на i-ю запись

seek(f,i);

//Читаем две подряд идущих записи

read(f,ri1);

read(f,ri2);

//сравниваем эти записи

if ri1.name > ri2.name then

begin

//Записываем в обратном порядке

seek(f,i);

write(f,ri2);

write(f,ri1);

ok:=false;

end;

end;

until ok;

end;