Временами при работе с файлами в языке Delphi попытка открыть файл завершается неудачным образом и вызывает ошибку времени выполнения данной программы. Причинами ошибки открытия файлов Delphi могут быть следующие факторы.
К примеру, программа пытается открыть файл, расположенный на гибком диске, которой еще не готов к работе (не закрыт механизм дискового накопителя, либо диск отсутствует в накопителе).
Второй причиной может быть ситуация, когда открываемый в режиме добавления файл отсутствует (то есть, нет файла – и потому добавлять некуда). В процессе запуска программы из Delphi при возникновении ошибки в момент открытия файла появляется исключение, и на дисплее ПК высвечивается специальное диалоговое окно с сообщением об ошибке открытия файла:
Если запуск программы проводится из системы Windows, то внешний вид окна с сообщением, сигнализирующем о возникновении ошибки при открытии файла, представится следующим образом
Для того, чтобы программа самостоятельно контролировала результат исполнения операции открытия файла, нужно провести проверку значения функции IOResult (что означает результат ввода/вывода: Input-Output – ввод-вывод, а Result — результат). Функция IOResult принимает значение 0 в случае успешного завершения операции ввода/вывода, иначе возникает код ошибки (не 0).
Для обеспечения возможности проверки программой результата выполнения инструкций ввода/вывода следует разрешить программе это делать. Поэтому перед инструкцией, осуществляющей вызов процедуры открытия файла, необходимо указать директиву компилятору – строку {$I-} для запрета автоматической обработки возможных ошибок ввода/вывода.
Данная директива как бы сигнализирует компилятору, что программа сама будет осуществлять контроль возможных ошибок. Следом за инструкцией открытия файла не забудьте указать директиву {$I+} для восстановления автоматической обработки возможных ошибок ввода/вывода.
На рис. ниже представим блок-схему алгоритма, реализующего открытие файла для добавления, которое обеспечит создание файла ( и в результате устранит ошибку, возникающую при возможности открытия несуществующего файла) в том случае, если открываемый для добавления файл отсутствует на диске.
Предложим фрагмент программы, который реализует вышеприведенный алгоритм действий.
. . .
AssignFile(fn,filename);
{$I-}
Append(fn) // открываем файл для добавления в него информации
{$I+}
if IOResult<> 0 // ошибка открытия файла then
Rewrite(fn); // открыть файл для записи
// здесь открыт существующий или новый файл
. . .
Перед окончательным завершением своей работы программой должны быть закрыты все открытые файлы. Чтобы это осуществить в языке Delphi, нужно сделать вызов процедуры close. Данная процедура содержит всего лишь один параметр – наименование файловой переменной.
Пример
откуда fn обозначает имя файловой переменной. Итак, мы разобрали некоторые ошибки открытия файлов Delphi. Двигаемся дальше.
Здравствуйте! Вижу вопрос уже канул в лету, а проблема то осталась. Немного переформулирую.
Возникла небольшая проблема и я никак не могу понять, в чём тут может быть дело. Есть код:
...
odOpenF.FileName:='';
if odOpenF.Execute then
begin
try
//При выполнении следующего оператора возникает исключительная ситуация
EXL:=CreateOleObject('Excel.Application');
EXL.Visible:=false;
EXL.Workbooks.Open(odOpenF.FileName);
...
Причём возникает только в том случае, если я в появляющемся dialog открытия файла, дважды щёлкаю по выбираемому файлу, а не выбираю, а затем нажимаю «Открыть» (в этом случае всё проходит нормально).
Без try.. except.. end
возникают следующие ошибки:
А иногда:
Ещё пару раз выдавал что-то там «недостаточно ресурсов», но я тогда не отскриншотил, а сообщение больше не появлялось.
Причём видимых причин для всего этого нет.
Ещё проводил один любопытный тест, в коде (на том месте где комментарий) писал MessageDlg(odOpenF.FileName, mtInformation, [mbOk], 0)
(ну мало ли, а вдруг как-то полевому заполняется FileName
). После этого ошибка снова переставала возникать.
В общем резюмируя скажу: что-то глючит. Однозначно где-то я ступил в коде, где именно — без понятия. Может быть вы подскажите?
Дополнение. Сегодня тестил на других компьютерах — ошибок не было. Похоже программа глючит только с ОСью х64
vlados2441 3 / 3 / 4 Регистрация: 11.01.2015 Сообщений: 126 |
||||
1 |
||||
Ошибка открытия файла через мою программу15.02.2015, 15:12. Показов 1530. Ответов 5 Метки нет (Все метки)
Всем доброго времени суток. Решил создать прогу в Делфи, которая шифрует файлы. Но проблема не в этом. Когда я нажимаю -Открыть- , появляется ошибка , но текст с файла все равно грузится. Помогите исправить. Исходник
0 |
Sigin 225 / 224 / 112 Регистрация: 20.10.2013 Сообщений: 808 |
||||
15.02.2015, 15:22 |
2 |
|||
Сообщение было отмечено Памирыч как решение Решение
1 |
3 / 3 / 4 Регистрация: 11.01.2015 Сообщений: 126 |
|
15.02.2015, 15:40 [ТС] |
3 |
О, спасибо, работает.
0 |
Mawrat 13095 / 5876 / 1706 Регистрация: 19.09.2009 Сообщений: 8,808 |
||||
15.02.2015, 17:39 |
4 |
|||
vlados2441, классы, унаследованные от TStrings, имеют метод LoadFromFile(). С помощью этого метода выполняется загрузка данных из текстового файла:
Ещё есть метод SaveToFile(‘путь к файлу’) — с помощью него содержимое экземпляра TStrings записывается в указанный файл.
0 |
пофигист широкого профиля 4662 / 3096 / 855 Регистрация: 15.07.2013 Сообщений: 17,864 |
|
15.02.2015, 19:06 |
5 |
Mawrat, думаю ТС нужно было мемо только для визуального контроля что он хоть что-то прочитал. Для шифрования файлов, заявленного в топике, мемо не очень-то нужно.
0 |
13095 / 5876 / 1706 Регистрация: 19.09.2009 Сообщений: 8,808 |
|
15.02.2015, 19:23 |
6 |
Да, в самом деле, цель — шифрование. Тогда с файлом надёжнее работать, как с бинарным, наверное. Читать через BlockRead() или использовать файловый поток TFileStream.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
15.02.2015, 19:23 |
6 |
While opening a dfm file by double clicking, I am getting following error:
Class TMyClass not found. Ignore the error and continue? Note: Ignoring the error may cause components to be deleted or property values to be lost.
When I click Cancel, I get following message
Error creating form: Class TMyClass not found.
When I click OK now, pas file is opened only.
In pas file MyClass unit is added (which conatins the TMyClass defination) and its path is also added in my search path (Ctrl clicking on unit name, takes me to the unit file)
Everything is fine as per me. I don’t know why I am getting this error and why am I not able to open this dfm file in RAD studio? Please help.