Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];

Вниз

Как удалить запись из потомка 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.039 c
14-1134685773
Antip
2005-12-16 01:29
2006.01.22
Delphi 2006, скорость загрузки


1-1134722112
scorpio_md
2005-12-16 11:35
2006.01.22
Как закрыть EXCEL без запроса на сохранение


14-1135578051
Иксик
2005-12-26 09:20
2006.01.22
Рождество Христово


14-1135575782
begin...end
2005-12-26 08:43
2006.01.22
С Днём рождения! 26 декабря


4-1131829875
nilin2005
2005-11-13 00:11
2006.01.22
переполнение буфера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский