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

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

Как удалить запись из потомка TFileStream [D7, WinXP]


mr.Evil ©   (2006-01-02 01:13:00) 

Исходник такого типа

unit RecordBase;

interface

uses
 classes, dialogs, sysutils;

 Type

  Variante = (A, B, C, D);

  type

   DatFile = packed record
   Vopros : String[255];
   Oa : String[50];
   Ob : String[50];
   Oc : String[50];
   Od : String[50];
   VarOt : Variante;
   End;

    TRecordStream = class(TFileStream)
     private
      function GetNumRecs : Longint;
      function GetCurRec  : Longint;
      procedure SetCurRec(RecNo : Longint);
     protected
      function GetRecSize : Longint; Virtual;
     public
      function SeekRec(RecNo : Longint; Origin : Word): Longint;
      function WriteRec(const Rec): Longint;
      function AppendRec(const Rec): Longint;
      function ReadRec(var Rec): Longint;
      procedure First;
      procedure Last;
      procedure NextRec;
      procedure PreviousRec;
      property NumRecs : Longint read GetNumRecs;
      property CurRec : Longint read GetCurRec write SetCurRec;
      end;

implementation

{ TRecordStream }

function TRecordStream.AppendRec(const Rec): Longint;
begin
Seek(0, 2);
Result := Write(Rec, GetRecSize);
end;

procedure TRecordStream.First;
begin
Seek(0, 0);
end;

function TRecordStream.GetCurRec: Longint;
begin
Result := (Position div GetRecSize) + 1;
end;

function TRecordStream.GetNumRecs: Longint;
begin
Result := Size div GetRecSize;
end;

function TRecordStream.GetRecSize: Longint;
begin
Result := SizeOf(DatFile);
end;

procedure TRecordStream.Last;
begin
Seek(0, 2);
Seek(- GetRecSize, 1);
end;

procedure TRecordStream.NextRec;
begin
if ((Position + GetRecSize) div GetRecSize) = GetNumRecs then
raise Exception.Create('Cannon read beyond end of file')
 else
  Seek(GetRecSize, 1);
end;

procedure TRecordStream.PreviousRec;
begin
if (Position - GetRecSize >= 0) then
Seek(- GetRecSize, 1)
 else
  raise Exception.Create('Cannon read beyond beginning of the file');
end;

function TRecordStream.ReadRec(var Rec): Longint;
begin
Result := Read(Rec, GetRecSize);
Seek(- GetRecSize, 1);
end;

function TRecordStream.SeekRec(RecNo: Integer; Origin: Word): Longint;
begin
Result := Seek(RecNo * GetRecSize, Origin);
end;

procedure TRecordStream.SetCurRec(RecNo: Integer);
begin
if RecNo > 0 then
Position := (RecNo - 1) * GetRecSize
else
Raise Exception.Create('Cannot go beyond beginning of file.');
end;

function TRecordStream.WriteRec(const Rec): Longint;
begin
Result := Write(Rec, GetRecSize);
end;

end.

Помогите разобратся как удалять записи.


mr.Evil   (2006-01-04 00:51:00) [1]

Спасиба все получилось !!!!!


Германн   (2006-01-03 02:18:00) [2]


> Вариант решения: У нас есть файл ‘A’ из пятью записями B1,
>  B2, B3, B4, B5. Нам надо удалить запись B3. смещаем записи
> B4, B5 и урезаем файл на длину записи B3.
> Думаю будет правильно.

Правильно думаешь.

Но если
> Порядок записей безраличен.
, то учти совет TUser ©   (02.01.06 13:53) [3]. Имхо, он пригодится, когда записей много.


mr.Evil   (2006-01-03 00:11:00) [3]

Порядок записей безраличен.

Вариант решения:У нас есть файл ‘A’ из пятью записями B1, B2, B3, B4, B5. Нам надо удалить запись B3. смещаем записи B4, B5 и урезаем файл на длину записи B3.
Думаю будет правильно.


TUser   (2006-01-02 13:53:00) [4]


> или путем перемещения всех записей

Илу путем перемещания последней записи на место удаляемой, если ответ на [1] отрицательный.


Anatoly Podgoretsky   (2006-01-02 13:02:00) [5]

mr.Evil ©   (02.01.06 01:13)  
Записи удаляются, или путем перемещения всех записей на место удаляемой, или путем создания нового файла.


TUser   (2006-01-02 11:23:00) [6]

Для начала - порядок записей после удаления должен сохраняться или нет?


Наверх

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