Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка исключений [D5, XP]


JohnKorsh ©   (2013-10-25 14:13:00) 

Добрый день!
Не подскажет ли кто как грамотно обработать исключение, если вставлен CardReader без карт.
Поясню. Программа записывает данные на USB-Flash накопитель. Чтобы пользователь знал, что Flash вставлен я периодически опрашиваю наличие съёмных дисков:
const
// Letters of the driver.
 Drive_L                       : array [1..26] of pchar = ('A:\', 'B:\', 'C:\', 'D:\', 'E:\',
                                                           'F:\', 'G:\', 'H:\', 'I:\', 'J:\',
                                                           'K:\', 'L:\', 'M:\', 'N:\', 'O:\',
                                                           'P:\', 'Q:\', 'R:\', 'S:\', 'T:\',
                                                           'U:\', 'V:\', 'W:\', 'X:\', 'Y:\',
                                                           'Z:\');
...
// По таймеру один раз в секунду:
  for i := 3 to 26 do
   begin
    if (GetDriveType (Drive_L [i]) = DRIVE_REMOVABLE) then
     begin
       Flash_Letter := Drive_L [i];
      k := DiskFree (Ord (Flash_Letter [1]) - 64);
      if (k < 1000000) then
       begin
          F_Inf.L_Info.Caption := 'На FLASH диске малло места' + Chr ($0D) + Chr ($0A) +
                '        (' + Flash_Letter + ':)   -  ' + FloatToStrF (k/1000000, ffFixed, 6, 6) +
                                    ' MB.' + Chr ($0D) + Chr ($0A) + 'Он может переполнится';
           F_Inf.ShowModal;
       end;

Пока пользователь (да и я тоже) не вставлял CardReader всё шло хорошо.
При вставленном CardReader-е добавилось четыре диска, пустые и, прии попытке k := DiskFree (Ord (Flash_Letter [1]) - 64); Windows выдаёт справедливо
ошибку, что не вставлен диск. Если четыре раза нажать на "Пропустить", то всё нормально до следующей секунды.
Хочу обрабатывать эту ошибку сам, но код
try
k := DiskFree (Ord (Flash_Letter [1]) - 64);
except
Continue;
end;
не помогает - всё равно Windows выводит сообщение.
Как избавиться от сообщения и Cotinue?


JohnKorsh   (2013-10-25 17:10:00) [1]

Спасибо большое.
Помог вот такой код:

 var
  EMode                                : Word;
...
for i := 3 to 26 do
     begin
      if (GetDriveType (Drive_L [i]) = DRIVE_REMOVABLE) then
       begin
        Flash_Letter := Drive_L [i];

        EMode := SetErrorMode(SEM_FAILCRITICALERRORS);
        try
         k := DiskFree (Ord (Flash_Letter [1]) - 64);
         if k <= 0 then
          begin
           SetErrorMode(EMode);
           Continue;
          end;
        finally
         SetErrorMode(EMode);
        end;
       ...


[ВладОшин]   (2013-10-25 15:56:00) [2]

https://www.google.ru/#newwindow=1&q=%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0+%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D0%B8+%D0%B4%D0%B8%D1%81%D0%BA%D0%B0+delphi


MBo   (2013-10-25 15:55:00) [3]

Проще не вести постоянный опрос, а отслеживать сообщение WM_DEVICECHANGE с соответствующими параметрами.

Если всё же теребить диски хочется, то подавлять данные ошибки можно так:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621.aspx


Туповатый   (2013-10-25 15:43:00) [4]

http://minilabmaster.com/cgi-bin/yabb2/YaBB.pl?action=print;num=1257185924


JohnKorsh   (2013-10-25 15:38:00) [5]

По размышлении суть вопроса проще - как определить вставлен ли в CardReader диск?


Туповатый   (2013-10-25 15:37:00) [6]

http://citforum.ru/programming/32less/les18.shtml


Ega23   (2013-10-25 15:37:00) [7]

http://www.delphisources.ru/pages/faq/faq_delphi_basics/DiskFree.php.html


JohnKorsh   (2013-10-25 15:17:00) [8]

Извините, а можно чуть подробнее?


Ega23   (2013-10-25 14:18:00) [9]

On error, -1 is returned.


Наверх

Титульная страница Поиск, карта сайта Написать письмо