Форум: "Начинающим";
Текущий архив: 2014.10.05;
Скачать: [xml.tar.bz2];
ВнизОбработка исключений Найти похожие ветки
← →
JohnKorsh (2013-10-25 14:13) [0]Добрый день!
Не подскажет ли кто как грамотно обработать исключение, если вставлен 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?
← →
Ega23 © (2013-10-25 14:18) [1]On error, -1 is returned.
← →
JohnKorsh (2013-10-25 15:17) [2]Извините, а можно чуть подробнее?
← →
Туповатый © (2013-10-25 15:37) [3]http://citforum.ru/programming/32less/les18.shtml
← →
Ega23 © (2013-10-25 15:37) [4]http://www.delphisources.ru/pages/faq/faq_delphi_basics/DiskFree.php.html
← →
JohnKorsh (2013-10-25 15:38) [5]По размышлении суть вопроса проще - как определить вставлен ли в CardReader диск?
← →
Туповатый © (2013-10-25 15:43) [6]http://minilabmaster.com/cgi-bin/yabb2/YaBB.pl?action=print;num=1257185924
← →
MBo © (2013-10-25 15:55) [7]Проще не вести постоянный опрос, а отслеживать сообщение WM_DEVICECHANGE с соответствующими параметрами.
Если всё же теребить диски хочется, то подавлять данные ошибки можно так:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621.aspx
← →
[ВладОшин] © (2013-10-25 15:56) [8]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
← →
JohnKorsh (2013-10-25 17:10) [9]Спасибо большое.
Помог вот такой код:
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;
...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2014.10.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c