Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2011, 16:02   #1
Heles
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 21
По умолчанию Удаление информации из тип.файла. Delphi7.

Нужно удалить из файла заданную запись, указанную в Edit.
В моем алгоритме при удалении информации удаляются только переменные, а текст в Memo остается. Ошибку свою знаю, но как исправить не знаю. Подскажите, как реализовать.
Текст программы:
Код:
unit Unit1;
...
type
  TRaspisanie = record
  Reis: string[3];
  Tip: string[25];
  Punkt: string[20];
  Time: string[5];
end;
var
FileRas: file of TRaspisanie;
FileName: string[30];
rasp: array[1..50] of TRaspisanie;
nzap: integer;
var
Form1: TForm1;
implementation

{$R *.dfm}


procedure TForm1.FormActivate(Sender: TObject); //Скрываем кнопки
begin
janArrowButton1.Hide;
janArrowRButton1.Hide;
end;



procedure TForm1.janHexButton1Click(Sender: TObject);  //Создаем файл бд
begin
  if SaveDialog1.Execute then
    begin
      SaveDialog1.Title := 'Save File';
      FileName := SaveDialog1.FileName;
      AssignFile(FileRas,FileName);
      Rewrite(FileRas);
    end;
  janArrowButton1.Show;
end;


procedure TForm1.janArrowButton1Click(Sender: TObject); //Добавляем запись в файл бд
begin
try
  nzap := nzap + 1;
  with rasp[nzap] do
  begin
    Reis := Edit1.Text;
    Tip := Edit2.Text;
    Punkt := ComboBox1.Text;
    Time := Edit3.Text;
    Memo1.Lines.Add('Номер записи: ' + IntToStr(nzap) + '.  Номер рейса: ' + (Reis) + '.  Тип самолета: '
    + Tip + '.  Пункт назначения: ' + Punkt + '.  Время вылета: ' + Time+'ч.');
      Write(FileRas,rasp[nzap]);
  end;
except
on EConvertError do begin ShowMessage('Поля не должны быть пустыми'); Exit; end;
end;
end;



procedure TForm1.janParButton1Click(Sender: TObject); //Открываем файл бд
begin
  If OpenDialog1.Execute then
    begin
      OpenDialog1.Title := 'Open File';
      FileName := OpenDialog1.FileName;
      AssignFile(FileRas,FileName);
      Reset(FileRas);
    end;
    Memo1.Clear;
    nzap := 0;
  while not eof(FileRas) do
    begin
      nzap := nzap + 1;
      Read(FileRas,rasp[nzap]);
      with rasp[nzap] do
      Memo1.Lines.Add('Номер записи: ' + IntToStr(nzap) + '.  Номер рейса: ' + (Reis) + '.  Тип самолета: '
    + Tip + '.  Пункт назначения: ' + Punkt + '.  Время вылета: ' + Time+'ч.');
    end;
  janArrowButton1.Show;
end;


procedure TForm1.janArrowRButton1Click(Sender: TObject); //Сортировка по возрастанию времени
var
i,j :  word;
st : TRaspisanie;
begin
  with rasp[nzap] do
  begin
  for i := 1 to nzap - 1 do                   // Сортировка массива записей.
  for j := i + 1 to nzap do
  if rasp[i].Time > rasp[j].Time then
    begin
          st := rasp[i];
          rasp[i] := rasp[j];
          rasp[j] := st;
    end;
  end;
  Memo1.Clear;
  for i := 1 to nzap do
  with rasp[i] do
  Memo1.Lines.Add('Номер записи: ' + IntToStr(i)  + '.  Номер рейса: ' + (Reis) + '.  Тип самолёта: '
  + Tip + '.  Время вылета: ' + Time + 'ч.  Пункт назначения: ' + Punkt + '.');
end;


procedure TForm1.janArrowButton2Click(Sender: TObject); //Выбрать запись для редактирования или удаления
var nzap: integer;
begin
  nzap := StrToInt(Edit4.Text);
  with rasp[nzap] do
    begin
      Edit1.Text := Reis;
      Edit2.Text := Tip;
      Edit3.Text := Time;
      ComboBox1.Text := Punkt;
    end;
end;


procedure TForm1.Button1Click(Sender: TObject); //Редактирование записи
var
k: longint;
nzap: integer;
begin
  nzap := StrToInt(Edit4.Text);
  reset(FileRas);
  read(fileras,rasp[nzap]);
  k := FilePos(FileRas);
  Seek(FileRas,nzap-1);
  if nzap = StrToInt(edit4.text) then
    begin
      with rasp[nzap] do
        begin
            Reis := Edit1.Text;
            Tip := Edit2.Text;
            Punkt := ComboBox1.Text;
            Time := Edit3.Text;
            Memo1.Clear;
            Memo1.Lines.Add('Номер записи: ' + IntToStr(nzap) + '.  Номер рейса: ' + (rasp[nzap].Reis) + '.  Тип самолета: '
            + rasp[nzap].Tip + '.  Пункт назначения: ' + rasp[nzap].Punkt + '.  Время вылета: ' + Time+'ч.');
        end;
    end;
  write(FileRas,rasp[nzap]);
  CloseFile(FileRas);
end;

procedure TForm1.Button2Click(Sender: TObject); //Удаление записи
var
nzap: integer;
begin
  nzap := StrToInt(Edit4.Text);
  reset(FileRas);
  read(fileras,rasp[nzap]);
  Seek(FileRas,nzap-1);
  if nzap = StrToInt(edit4.text) then
    begin
      with rasp[nzap] do
        begin
            Reis := '';
            Tip := '';
            Punkt := '';
            Time := '';
            Memo1.Clear;
            Memo1.Lines.Add('Успешно удалено');
        end;
    end;
  write(FileRas,rasp[nzap]);
  CloseFile(FileRas);
end;

end.
Изображения
Тип файла: jpg Безымянный.jpg (80.7 Кб, 42 просмотров)
Heles вне форума Ответить с цитированием
Старый 10.12.2011, 16:07   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а текст в Memo остается.
Если речь только об этом то рекомендую просто перечитывать файл заново в Мемо после удаления полностью.
Цитата:
FileRas: file of TRaspisanie;
А знаешь, вот эту задачу я бы на твоем месте решал через INI файлы... ИМХО проблем меньше было бы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.12.2011, 16:42   #3
Heles
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Если речь только об этом то рекомендую просто перечитывать файл заново в Мемо после удаления полностью.
Дело в том, что у меня две разные процедуры. Первая - открыть файл. После открытия файла в мемо записывается инфа в файле. Вторая - удалить инфу в файле. После удаления удаляются только переменные в первой процедуре. Сами же пояснения остаются. И их никак в этой процедуре не изменить.
Только такая мысль:
Если использована процедура "удалить" тогда в процедуре "открыть файл" записать новую информацию в мемо. А вот как в машинном коде правильно это записать...
Цитата:
Сообщение от Stilet Посмотреть сообщение
А знаешь, вот эту задачу я бы на твоем месте решал через INI файлы... ИМХО проблем меньше было бы.
В этой задаче обязательно нужно использовать мемо, да и самому интересно. В будущем всякое понадобится. И не нам, а нашим клиентам.
Heles вне форума Ответить с цитированием
Старый 10.12.2011, 19:18   #4
Heles
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 21
По умолчанию

Еще интересует вопрос:
Если в файле одной ячейки присвоена переменная типа integer и её нужно удалить, как это сделать? например a := ' '; не получится.
Heles вне форума Ответить с цитированием
Старый 10.12.2011, 19:28   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вторая - удалить инфу в файле.
Я так понимаю ты это не умеешь делать? Чтоб удалить данные из файла физически его перезаписывают но уже без этих данных.
В цикле сможешь показать считывание-запись данных? Если да добавь условие на пропуск записи, если то или иное поле равно искомому-удаляемому.
Почитай про типизированные файлы в любой книге по паскалю.
Вот легкий пример из одного школьного учебника, подстроенный под тебя
Код:
assign(input,'file1');reset(input);
assign(output,'file2');rewrite(output);
while not eof(input) do begin
 read(a);
 if a.Reis<>'чему-то' then write(a);
end;
close(input);close(output);
Где a - TRaspisanie
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.12.2011, 21:42   #6
Heles
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я так понимаю ты это не умеешь делать? Чтоб удалить данные из файла физически его перезаписывают но уже без этих данных.
В цикле сможешь показать считывание-запись данных? Если да добавь условие на пропуск записи, если то или иное поле равно искомому-удаляемому.
Почитай про типизированные файлы в любой книге по паскалю.
Вот легкий пример из одного школьного учебника, подстроенный под тебя
Вот:
Код:
begin
 Reset(FileRas); // открываем
 while not eof(FileRas) do  // повторяем пока не наступит конец файла
  begin
   for i := 1 to nzap do  //проверяем каждую запись сначала
    begin   
     read(fileras,rasp[i]); //читаем первую запись и до N записей
     Seek(FileRas,i-1);  // Устанавливаем указатель в начало записи
     with rasp[i] do  // Рассмотрим первую запись и до N записей
      begin 
       if i <> StrToInt(edit4.text) then  //Проверим, если мы не хотим удалять первую запись и до N, то
       Write(FileRas,rasp[i]) //запишем эту запись в файл
       else
       Seek(FileRas,i); //Иначе установим указатель на +1 и продолжим дальше записывать файлы. Но здесь ничего не происходит. Нужно как ты сказал перезаписать файл. 
//Но как мы перезапишем, если мы его сначало удалим и все наши записи, записанные ранее пользователем, удаляться? А нам надо одну запись только удалить.
     end;
    end;
   end;
 CloseFile(FileRas);
end;

end.
Какие допущены ошибки, что нужно исправить, добавить?
Heles вне форума Ответить с цитированием
Старый 10.12.2011, 22:05   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Задача этого кода? Перезаписать файл без удаленной записи? Я его не понимаю.
Зачем например ты пишешь
Цитата:
Seek(FileRas,i-1); // Устанавливаем указатель в начало записи
К чему это?
ИМХО тут все нужно переделать полностью (имею ввиду вышеприведенный кусок)
Умеешь работать с blockread-blockwrite и динамической памятью?
Я бы ими оперировал - это наиболее скоростной метод перезаписи
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.12.2011, 22:25   #8
Heles
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Задача этого кода? Перезаписать файл без удаленной записи? Я его не понимаю.
Зачем например ты пишешь
К чему это?
ИМХО тут все нужно переделать полностью (имею ввиду вышеприведенный кусок)
Умеешь работать с blockread-blockwrite и динамической памятью?
Я бы ими оперировал - это наиболее скоростной метод перезаписи
Задача кода состояла в том, чтобы удалить нужную запись из файла, сохраняя остальные записи, которые были в файле.
Если имеется в виду Read, Write - то умею, точнее научился, может ошибки присутствуют. С динамической памятью умею есть пробелы, и не понимаю, зачем она тут нужна.

В общем, по порядку, сама задача:
Есть файл базы данных, он пуст.
Нужно в этот файл ввести данные о вылетах самолета.
Функции задачи:
Добавлять записи в файл, редактировать их и удалять. И не все целиком, а те, которые указывает пользователь.


Я использовал массив записей. В одной ячейке массива хранятся данные о вылете самолета. Одна ячейка - одна запись.
К примеру пользователь задал 5 записей. И потом ему надо удалить запись №3. Вся инфа естественно сохраняется в файл.
Heles вне форума Ответить с цитированием
Старый 11.12.2011, 13:49   #9
Heles
Пользователь
 
Регистрация: 17.09.2011
Сообщений: 21
По умолчанию

еще актуально
Heles вне форума Ответить с цитированием
Старый 11.12.2011, 13:58   #10
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
К примеру пользователь задал 5 записей. И потом ему надо удалить запись №3.
1)считать 5 записей из файла в массив записей
2)
Код:
For i:= N to OK-1 do запись[i]:=запись[i+1]; ok:=Ok-1;
где N - номер удаляемой записи а OK - общее количество записей в файле
3) Rewrite(файл); Переписать из массива записи в файл обратно!
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с кодировкой текстовой информации в Delphi7 Человек Панда Помощь студентам 9 19.07.2011 23:05
checkbox + php [удаление информации из БД] webber9989 PHP 14 18.08.2010 17:15
Удаление повторной информации из таблиц paratruper17 Microsoft Office Word 8 03.11.2009 10:31
Проблема такова: язык:Delphi7; сохранения файла; загрузка файла в String Grid lightdevil Общие вопросы Delphi 3 06.03.2009 23:10
Тип информации Artem Общие вопросы Delphi 5 29.08.2007 08:14