|
| ||||||||||||||||||
FileExists выдает окно ошибки при чтении файлаАвтор: Владислав Демьянишин
В Delphi при работе функции FileExists в момент обращения к файлу на несуществующем диске появляется диалоговое окно «Диск отсутствует» (рис. 1). Продолжить работу программы при этом можно, нажав на кнопку «Продолжить», но событие неприятное и многих пользователей может ввести в ступор.
Рис. 1
Решается это очень просто, при этом применение блока Try..Except здесь не поможет. А вот системная функция SetErrorMode может оказаться очень кстати.
Функция SetErrorMode WinAPI Windows определяет то, как операционная система будет обрабатывать некоторые типы серьезных ошибок. Когда установлен режим SEM_FAILCRITICALERRORS, операционная система не будет выводить окно критической ошибки. Вместо этого операционная система отправит сообщение об ошибке в вызывающий процесс, то есть нашей программе, что нам и необходимо. Главное - потом включить прежний режим обратно. Вот ее заголовок:
function SetErrorMode( Mode: integer ): integer;
Функция устанавливает режим обработки ошибок, но в то же время возвращает текущий (старый) режим. Этот старый режим необходимо сохранить в переменной типа integer, а в конце нашего кода восстановить. Функция SetErrorMode может принимать следующие значения:
SEM_FAILCRITICALERRORS - Если этот флаг установлен, операционная система не отображает окно сообщения обработчика критических ошибок при возникновении такой ошибки. Вместоэтогооперационнаясистемаотправляетошибкувызывающемупроцессу.
SEM_NOGPFAULTERRORBOX - Если этот флаг установлен, операционная система не отображает окно сообщения об общей ошибке защиты при возникновении такой ошибки. Этот флаг должен устанавливаться только отладочными приложениями, которые сами обрабатывают ошибки general protection (GP) с помощью соответствующего обработчика исключений.
SEM_NOOPENFILEERRORBOX - Если этот флаг установлен, операционная система не отображает окно сообщения, когда ей не удается найти файл. Вместо этого ошибка возвращается вызывающему процессу.
Например, изначальнонашкодвыгляделтак:
…
if FileExists( s ) then
Slots.AddObject( s, pointer( PosY ) );
…
Тогда с учетом применения системной функции SetErrorMode перепишем код вот так:
procedure TForm1.ReadIniSlots;
var PosY, OldMode : integer;
s : string;
begin
…
// Отключаем системную обработку ошибок и передаем обработку нашей программе
OldMode := SetErrorMode( SEM_FAILCRITICALERRORS );
if FileExists( s ) then
Slots.AddObject( s, pointer( PosY ) );
// Восстанавливаем обычный режим обработки ошибок
SetErrorMode( OldMode );
…
end;
Благодаря этой комбинации, при обращении к файлу на несуществующем диске (например, извлеченный CD-ROM или DVD-ROM, сетевой диск) система не станет выводить собственное диалоговое окно ошибки, а позволит функции FileExists вернуть, как ей и положено, значение false и наша программа сама сможет отработать возникшую ситуацию как нам это нужно. И это без всяких пугающих окошек.
© Владислав Демьянишин
Вы находитесь на официальном сайте Владислава Демьянишина - разработчика игры Dune IV (Dune 4). На нашем сайте Вы можете бесплатно скачать игры Dune IV (Dune 4), Battle City (Танчики с Dendy/Nintendo), читы к играм и многое другое. Также Вы можете скачать бесплатно программы и полезные утилиты. Все программы чистые, т.е. не содержат вирусов и иного вредоносного ПО.
Среди доступных программ есть мобильная читалка книг, менеджер переноса файлов с фото- и видеокамер на компьютер, текстовый редактор, WYSIWYG редактор, 3D аниматор, GIF аниматор, AVI аниматор, пакетный конвертор изображений, редактор электрических схем, программа для скриншотов, диспетчер тем рабочего стола и другие.
На нашем сайте можно не только бесплатно скачать игры, но и документацию и книги по программированию на MIDLetPascal, Turbo Pascal 6, Turbo Pascal 7, Borland Pascal, по программированию устройств Sound Blaster, Adlib, VESA BIOS, справочник Norton Guide и много другой полезной информации для программистов, включая примеры решения реальных задач по созданию резидентных программ.
| |||||||||||||||||||
|
|||||||||||||||||||