Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.22;
Скачать: CL | DM;

Вниз

Как удалить запись из потомка TFileStream   Найти похожие ветки 

 
mr.Evil ©   (2006-01-02 01:13) [0]

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

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.

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


 
TUser ©   (2006-01-02 11:23) [1]

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


 
Anatoly Podgoretsky ©   (2006-01-02 13:02) [2]

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


 
TUser ©   (2006-01-02 13:53) [3]


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

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


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

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

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


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


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

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.01.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.035 c
11-1117438691
mmn
2005-05-30 11:38
2006.01.22
Секция {$I name.inc} в .DPR файле


3-1132913589
Ega23
2005-11-25 13:13
2006.01.22
TADODataSet.CreateParameter в ран-тайме


14-1135531495
Витёк
2005-12-25 20:24
2006.01.22
Как отправить письмо!?


2-1136670008
BiggieSmalls
2006-01-08 00:40
2006.01.22
Excel и StringGrid


2-1135624073
erudit
2005-12-26 22:07
2006.01.22
Перевернуть компонент Image1