Помогите устранить ошибку

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Помогите устранить ошибку

Сообщение vadi61 » 15.11.2015 02:52:34

Мне нужно сохранять пути к некоторым файлам в отдельном текстовом файле.
Я внес дополнения в реестр и у меня в проводнике по нажатию правой кнопки мыши на файле в контекстном меню есть команда <Сохранить>, которая запускает программку записи пути к файлу. В программке всего две процедуры:
Код: Выделить всё
procedure TForm1.SaveToLogFile;
var
  f: TextFile;
  Pfad: string;                // Путь к файлу-источнику, на котором кликнули правой кнопкой мыши (ПКМ)
  PathToLog: string;
begin
  PathToLog := ExtractFilePath(ParamStr(0)) + 'Sicherung.log';
  Pfad := ParamStr(1);             // В param 1 хранится путь к файлу-источнику

  try
    AssignFile(f, PathToLog);

    if not FileExists(PathToLog) then   
    begin
      Rewrite(f);
      CloseFile(f);
    end;

      Append(f);                  
    try
      Writeln(f, Pfad);              
      CloseFile(f);
    except
      MessageDlg('Ошибка записи!', mtError, [mbOk],0);
    end;
  except
    MessageDlg('Ошибка при сохранении пути к файлу: ' + Pfad, mtError,[mbOk], 0);
  end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  Form1.Hide;
  SaveToLogFile;
  Close;
end;

Так вот, время от времени выскакивает системная ошибка Access denied. Обычно это бывает когда я сохраняю пути сразу к нескольким файлам (выделяю группу файлов и кликаю на них правой кнопкой мыши). Причем, какой-то один файл вызывает ошибку, а остальные записываются.

И еще. Я бы с удовольствием сделал эту программу вообще как Programm (без окон, просто begin - end), но не могу отобразить окошко "Ошибка записи!" (Uses Dialogs для MessageDlg или Windows для MessageBox не воспринимаются).
Есть ли решение отобразить диалог в простой программе?
vadi61
незнакомец
 
Сообщения: 2
Зарегистрирован: 29.10.2015 11:31:56

Re: Помогите устранить ошибку

Сообщение Sharfik » 15.11.2015 03:31:40

1) У тебя одновременно несколько копий программы пытаются записать в один и тот же файл не зная друг о друге.
Самый простой способ, перед открытием лога проверять есть ли файл "марке". Если нет, то создаешь его и открываешь второй файл на добавление строк. Если он есть, то в цикле(нужно уведомление об ошибке если прошло минут 5 и файл не пропал) ждешь пока "маркер" не исчезнет и создаешь его опять же заново. Можно еще блокировать файл на редактирование и проверять по этому параметру, но там как то заморочено это все.
Ну или клиент сервер писать из двух программ. Одна все время живет, вторая только посылки в виде имен файлов отправляет ей.

2) В основном модуле сделай проверку по нужному условию, например наличию параметра второго и если нужно только одно действие, то
Код: Выделить всё

Application.ShowMainForm:=False;
//и закрыть не забудь программу в конце
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

Re: Помогите устранить ошибку

Сообщение vadi61 » 15.11.2015 14:54:27

Ведь действительно несколько программ одновременно пишут в один и тот же файл! Спасибо, сейчас буду исправлять...
vadi61
незнакомец
 
Сообщения: 2
Зарегистрирован: 29.10.2015 11:31:56


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 234

Рейтинг@Mail.ru