![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка исключений [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.