Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с удалением записи в типизированном файле [D6, WinXP]


Delphin ©   (2004-06-30 23:43:00) 

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); ), и Р принимает значение равным нулю.
Мастера, Кто знает, как этот баг устранить ?
З.Ы
Заранее благодарен


Delphin   (2004-07-01 15:15:00) [1]

Hi ALL!
Проблему исправил так:
Вместо P := FilePos(F) поставил
P:=I;
И в промежутке кода между Reset(F); И Edit1.Text := Member.Nam; Вставил такую вещ: While Not EOF(F) Do
Read(F,Member);
I:=FilePos(F);
И теперь всё работает достаточно успешно :))
З.Ы Всем спасибо


Delphin   (2004-07-01 12:19:00) [2]

Народ, огромное спасибо. Щас попробую немного изменить код ;)


Думкин   (2004-07-01 07:33:00) [3]

Есть книга Бакнелла.
http://www.giftbooks.ru/ws/18/1792.htm
там описано как с такими зверями красиво работать. Все примеры - на сайте издательства.


QuasiLamo   (2004-07-01 06:02:00) [4]

procedureTForm1.Button7C(Sender: TObject);
var
 P, S, FS: Integer;
begin
 S := 0;
 P := 0;
 P := FilePos(F);//У тебя файл почему не открыт заранее?
 Seek(F, S);
 AssignFile(TF, 'Member.Tmp');
  if notFileExists('Member.Tmp') then
   Rewrite(TF)
  else
   Erase(TF);// если ты тут сотрешь файл, то
  whileP - 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 notFileExists('Member.Dat') then
   Rewrite(F)
  else
   Reset(F);
 Edit1.Text := Member.Nam;
 Edit2.Text := Member.Fam;
end;


Плохиш   (2004-07-01 01:24:00) [5]


> Delphin ©   (30.06.04 23:43)

Чуть глаза не сломал :-( Вас что мама не учила код оформлять?

Твой кусок работает так, как ты его и написал.
1. После Reset указатель находится на записи 0
2. Посмотри внимательней на свой код и дважды внимательно на код в коментариях!


QuasiLamo   (2004-07-01 00:26:00) [6]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо