Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление элемента из файла, Удаление элемента из типизирован. файла 
:(
    Опции темы
Компоратор
Дата 1.7.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 16.4.2006
Где: Петропавловск-Кам чатский

Репутация: нет
Всего: 1



Есть тут у меня типизированный файл.
Пусть в него записывается какой-нибудь 
Код

Rec = packed record
     Rec1: integer;
     Rec2: integer;
end;


Тут вдруг встала колом задача - удаление произвольной записи. Никогда такого не делал. Юзаю обычный AssignFile без FileStream.

Мне думается, что нужно сдвигать все записи выше, только я догнать не могу - как это организовать.

Может кто что подскажет? Желательно с кодом.
PM MAIL ICQ   Вверх
Yanis
Дата 1.7.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



Как это как организовать?
Читаешь следующую запись после той которую надо удалить, передвигаешься на начало удаляемой записи и пишешь считанную и т.д.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Компоратор
Дата 3.7.2007, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 16.4.2006
Где: Петропавловск-Кам чатский

Репутация: нет
Всего: 1



Немного подправил пост...

Ок, вот небольшой примерчик (повторюсь - самый примитивный, без обработки исключений):

Код

type
    Rec = packed record
     Rec1: integer;
     Rec2: integer;
end;

Код

var
   RecBody: TRec;
   RecFile: file of TRec;
   I: integer;

Код

begin
            ...
while not EOF(RecFile) do
        begin
          Seek(RecFile,I+1);
          Read(RecFile,RecBody);
          Seek(RecFile,I);
          write(RecFile, RecBody);
          Inc(I);
        end;


Все удаляется, единственное, я еще не понял, как последнюю запись обрезать - она лишняя получается вроде.
 Есть такая штука - Truncate, как ей можно воспользоваться в данном случае?

Это сообщение отредактировал(а) Компоратор - 3.7.2007, 07:19
PM MAIL ICQ   Вверх
Yanis
Дата 3.7.2007, 06:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



Цитата(Компоратор @  3.7.2007,  06:27 Найти цитируемый пост)
 Есть такая штука - Truncate, как ей можно воспользоваться в данном случае? 

Код
Seek(f, FileSize(f) - 1);
Truncate(f);



--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Компоратор
Дата 3.7.2007, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 16.4.2006
Где: Петропавловск-Кам чатский

Репутация: нет
Всего: 1



Вот итоговая процедура:

Код

  TRecBody = packed record
    Name: string[255];
    Password: string[255];
    Note: string[255];
  end;

Код

procedure TMainForm.DeleteItem;
{полное удалдение записи о пароле}
var
  RecBody: TRecBody;
  RecFile: file of TRecBody;
  I,J: integer;
begin
  AssignFile(RecFile,ExtractFilePath(Application.ExeName)+'\Content.rpd');
  Reset(RecFile);
  for J:=0 to ListBox.Count-1 do //элементы отображены в ListBox
  if ListBox.Selected[J] then // выбрали строку J
      begin
      Seek(RecFile,J);
      Read(RecFile,RecBody);
      if MessageDlg('Запись будет удалена',mtConfirmation,[mbOk,mbCancel],0) = mrOk
      then
      begin
        I:=J;
        while not EOF(RecFile) do //до конца файла
        begin
            {читаем следующий элемент
             и записываем в предыдущий...}
            Seek(RecFile,I+1);
            if not Eof(RecFile) then
            begin
              Read(RecFile,RecBody);
              Seek(RecFile,I);
              write(RecFile, RecBody);
              Inc(I);
            end;
        end;
        seek(RecFile, FileSize(RecFile)-1);
        Truncate(RecFile); //обрезаем нафиг конец у файла
      end;
        CloseFile(RecFile);
        Exit;
      end;
  CloseFile(RecFile);
end;

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1071 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.