![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с удалением записи в типизированном файле [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]ну дык чтобы поэлементно удалять, нужно доступ к файлу индексированный заиметь, а не последовательый. по моему так