Текущий архив: 2004.07.18;
Скачать: CL | DM;
Вниз
Проблема с удалением записи в типизированном файле Найти похожие ветки
← →
Delphin © (2004-06-30 23:43) [0]Hi ALL! Есть проблема с удалением записи в типизированном файле:
Вот сабж:
type
TMember=Record
Nam,Fam:String[25];
End;
......
var
Form1: TForm1;
F,TF:File of TMember;
I,C:Integer;
Member:Tmember;
..........
procedure TForm1.Button7Click(Sender: TObject);
Var
P,S,FS:Integer;
begin
S:=0;
P:=0;
P:=FilePos(F);
Seek(F,S);
AssignFile(TF,"Member.Tmp");
IF Not FileExists("Member.Tmp") Then
Rewrite (TF)
Else
Erase(TF);
While P-1>S Do Begin
Seek(F,S);
Seek(TF,S);
Read(F,Member);
Write(TF,Member);
Inc(S);
End;
FS:=S+1;
{While Not Eof(F) Do Begin
Seek(F,FS);
Seek(TF,S);
IF Not EOF(F) Then
Read(F,Member);
Write(TF,Member);
Inc(S);
End; }
CloseFile(F);
Erase(F);
CloseFile(TF);
Rename(TF,"Member.Dat");
AssignFile(F,"Member.Dat");
IF Not FileExists("Member.Dat") Then
Rewrite(F)
Else
Reset(F);
Edit1.Text:=Member.Nam;
Edit2.Text:=Member.Fam;
end;
В первый раз программа удаляет нужную запись без проблем.
Во второй раз она удалчет все записи (если повторно нажать на кнопку). Пробовал пошагувую компиляцию, вот результат:
во второй раз не определяет позицию в файле (P:=FilePos(F); ), и Р принимает значение равным нулю.
Мастера, Кто знает, как этот баг устранить ?
З.Ы
Заранее благодарен
← →
QuasiLamo © (2004-07-01 00:26) [1]ну дык чтобы поэлементно удалять, нужно доступ к файлу индексированный заиметь, а не последовательый. по моему так
← →
Плохиш © (2004-07-01 01:24) [2]
> Delphin © (30.06.04 23:43)
Чуть глаза не сломал :-( Вас что мама не учила код оформлять?
Твой кусок работает так, как ты его и написал.
1. После Reset указатель находится на записи 0
2. Посмотри внимательней на свой код и дважды внимательно на код в коментариях!
← →
QuasiLamo © (2004-07-01 06:02) [3]procedure TForm1.Button7C(Sender: TObject);
var
P, S, FS: Integer;
begin
S := 0;
P := 0;
P := FilePos(F);//У тебя файл почему не открыт заранее?
Seek(F, S);
AssignFile(TF, "Member.Tmp");
if not FileExists("Member.Tmp") then
Rewrite(TF)
else
Erase(TF);// если ты тут сотрешь файл, то
while P - 1 > S do
begin
Seek(F, S);
Seek(TF, S);// тут получишь ошибку
Read(F, Member);
Write(TF, Member);
Inc(S);
end;
FS := S + 1;
CloseFile(F);
Erase(F);
CloseFile(TF);
Rename(TF, "Member.Dat");
AssignFile(F, "Member.Dat");
if not FileExists("Member.Dat") then
Rewrite(F)
else
Reset(F);
Edit1.Text := Member.Nam;
Edit2.Text := Member.Fam;
end;
← →
Думкин © (2004-07-01 07:33) [4]Есть книга Бакнелла.
http://www.giftbooks.ru/ws/18/1792.htm
там описано как с такими зверями красиво работать. Все примеры - на сайте издательства.
← →
Delphin © (2004-07-01 12:19) [5]Народ, огромное спасибо. Щас попробую немного изменить код ;)
← →
Delphin © (2004-07-01 15:15) [6]Hi ALL!
Проблему исправил так:
Вместо P := FilePos(F) поставил
P:=I;
И в промежутке кода между Reset(F); И Edit1.Text := Member.Nam; Вставил такую вещ: While Not EOF(F) Do
Read(F,Member);
I:=FilePos(F);
И теперь всё работает достаточно успешно :))
З.Ы Всем спасибо
Страницы: 1 вся ветка
Текущий архив: 2004.07.18;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.037 c