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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2015, 18:59   #1
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию Ошибка при открытии диалога чтения файла.

Имеется програмка. Она по таймеру открывает текстовый файл считывает данные и закрывает его и так по циклу( таймеру) периодически.

При открытии диалога открытия файла( компонент OpenDialog открываю файл) во время действия таймера у меня не читается файл ( выдает что файла нету).

Если таймер приостанавливаю потом открываю файл то ошибки нету. Но как только таймер опять запуская опять ошибка не видит файла.

По логике понятно что почему то не может одновременно открывать 2 файла. Но суть в том что и по очереди тоже не может в конце концов.
Т.е. если остановил таймер OpenDialog прочитал другой файл, потом таймер врубая и ошибка эта. Такое ощущение , что после чтения файла компонентом OpenDialog файл остается открытым и недает читать другие файлы.

Возможно необходимо как то вручную еще закрывать файл в этом компоненте?( OpenDialog)
Illusiony вне форума Ответить с цитированием
Старый 09.01.2015, 19:11   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

для примера, пока есть ассоциация переменной F на один файл, то привязать переменную F к другому файлу будет невозможно.
Код:
var F:File;
begin
   AssignFile(F,'Name.txt');
   Reset(F,1);
   //тут чего-то творим
   CloseFile(F);
end;
делай так:
Код:
var F1,F2:File;
begin
   AssignFile(F1,'Name1.txt');
   Reset(F1,1);
   AssignFile(F2,'Name2.txt');
   Reset(F2,1);
   //тут делаем что нам надо
   CloseFile(F2);
   CloseFile(F1);
end;
а то, что файл вообще существует - проверяй функцией
Код:
 if (FileExist(путь+имя)=True) then...
а вообще, я OpenDialog'ом открыаю файлы так:
Код:
//----- открываем файл ---------------------------------------------------------
procedure TForm1.N2Click(Sender:TObject);
var ps:Integer;
begin
   OpenDialog1.Filter:='Музыкальные файлы|*.mp3|Все файлы|*.*';
   OpenDialog1.InitialDir:='C:\Documents and Settings\'+us+'\Мои документы';
   if OpenDialog1.Execute and FileExists(OpenDialog1.FileName)then
   begin
      sps[1]:=OpenDialog1.FileName;//запоминаю первое имя - очень мне нужно, вам - не знаю
      FileName:=OpenDialog1.FileName;//полное имя с путём и расширением
      Put:=ExtractFilePath(Opendialog1.FileName);
      //тут делаю что мне надо   
   end;
end;
и никаких ошибок ни разу не выдавало за 11 лет использования этого компонента
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 09.01.2015 в 19:18.
NetSpace на форуме Ответить с цитированием
Старый 09.01.2015, 19:19   #3
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Во второй форме мною не было функций окрывания файлов, тем более с переменной f ( именно она используется при открывании по таймеру). Может быть сам компонент OpenDialog при открытии присваивает именно этой переменной. Но они же еще в разных функциях и в разных формах к тому же.
Суть в том что вы подумали что я так же открываю второй файл. Но я открываю его через OpenDialog , а в нем не указывается переменная файла. Вот собственно как получается.
для уверенности поменял на ff, разницы никакой.

Последний раз редактировалось Illusiony; 09.01.2015 в 19:24.
Illusiony вне форума Ответить с цитированием
Старый 09.01.2015, 19:23   #4
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

а попробуй-ка через такой OpenDialog открыть свои файлы. тут полный проект.
Код:
program Project1;
uses Windows,SysUtils,CommDlg;

{$R *.RES}
var s:string;
    fn:array[0..256]of Char;
    ofn:tagOFN;

begin
   s:=ParamStr(1);
   if(s='')then
   begin
      FillChar(ofn,sizeof(ofn),0);
      ofn.lStructSize:=sizeof(ofn);
      ofn.hInstance:=hInstance;
      ofn.lpstrFilter:='Все файлы'+#0+'*.*';
      ofn.lpstrInitialDir:=PChar(GetCurrentDir);
      ofn.lpstrTitle:='Открыть файл';
      ofn.Flags:=OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST;
      ofn.lpstrFile:=fn;
      ofn.nMaxFile:=256;
      GetOpenFileName(ofn);
      s:=fn;
   end;
  if(s<>'')then MessageBox(0,PChar(s),'',0);
end.

эту функцию можно применить в проектах с другими формами - она минимальная и удобна.
переменная s в конце процедуры как раз содержит в себе имя файла
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace на форуме Ответить с цитированием
Старый 09.01.2015, 19:42   #5
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Открывал вашей последней программой первый раз нормльно. Запустил второй раз delphi 7 так подвис что даже диспетчер не давал запустить, но при этом окнами другими управлять можно было.

Код:
if (FileExist(путь+имя)=True) then...
я как раз и использую толко вот так
Код:
if FileExists('../output_log.txt') then begin
 end
  else begin
  ShowMessage('Лог файла:output_log.txt не существует. Воспользуйтесь пунктом Faq п.ХХ'); // если лог файла НЕ существует
  Application.Terminate;// Закрываем программу принудительно
  end;

Последний раз редактировалось Illusiony; 09.01.2015 в 19:46.
Illusiony вне форума Ответить с цитированием
Старый 09.01.2015, 20:30   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Запустил второй раз delphi 7 так подвис что даже диспетчер не давал запустить
Это распространенная проблема GetOpenFileName().
На форумах говорят что это из-за иконок. Мол эксплорер не может нормально обработать ресурсы какого-то файла и начинает паниковать. Много раз попадался на это проблему решил сменой InitialDir в другой каталог.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.01.2015, 21:01   #7
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

А чем собственно ваш способ (NetSpace) отличается от стандартного компонента?
В чем может быть ошибка у меня?

Я читаю так:
Код:
with dlgOpen1, mmo6 do   // Delphi-manual.ru/les7end.php
if Execute then begin
//AssignFile(f,);
//InitialDir:=GetCurrentDir;
Lines.LoadFromFile(FileName);
end;
St:=mmo6.Lines.Text;//
Но что то мне подсказывает что я сдесь напорол.

Последний раз редактировалось Illusiony; 09.01.2015 в 21:09.
Illusiony вне форума Ответить с цитированием
Старый 09.01.2015, 21:46   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ни чего не понял. В таймере OpenDialog вызываете? Или просто открываете и читаете файл? Да, и OpenDialog ничего не открывает, а просто возвращает имя выбранного файла.
Цитата:
При открытии диалога открытия файла( компонент OpenDialog открываю файл) во время действия таймера у меня не читается файл
Эта фраза требует расшифровки, лучше кодом, а то на словах получается что-то вроде расстояния в амперах
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.01.2015, 02:06   #9
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Illusiony Посмотреть сообщение
При открытии диалога открытия файла( компонент OpenDialog открываю файл) во время действия таймера у меня не читается файл ( выдает что файла нету).
Так и "выдает что файла нету"? Или это твой вольный пересказ выданного тебе на малознакомом языке сообщения?
P.S. Учти что если файл уже кем-то/чем-то открыт, то его либо вообще нельзя открыть в другой программе, либо можно открыть только на чтение. И тут важно точно знать как та самая программа, которая открывает файл по таймеру, его открывает.
northener вне форума Ответить с цитированием
Старый 10.01.2015, 09:08   #10
hooko
Пользователь
 
Аватар для hooko
 
Регистрация: 04.05.2012
Сообщений: 13
По умолчанию

Вставь обработку исключений.
Самое потрясающее достижение программного обеспечения состоит в том, что оно способно уничтожить стабильность и любые достижения аппаратного обеспечения.
(Henry Petroski)
hooko вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при открытии файла Klim Bassenger Microsoft Office Excel 2 16.09.2018 15:44
Ошибка при открытии файла hosts bananasus Общие вопросы Delphi 10 23.02.2011 19:38
Ошибка при открытии файла Ciberal Общие вопросы Delphi 2 09.06.2009 22:58
Ошибка при открытии файла.doc ruavia3 Microsoft Office Word 1 20.05.2009 20:27
C++: ошибка при открытии файла Retiz Помощь студентам 2 30.08.2008 22:12