Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2007, 16:32   #1
yourself
Пользователь
 
Аватар для yourself
 
Регистрация: 10.11.2007
Сообщений: 38
По умолчанию delphi - как обработать ошибку перехода на пустой cd-rom?

Проблема такая: перетащил из палитры компонентов Win 3.1 следующие: FileListBox, DirectoryListBox, DriveComboBox, Label и Edit. Все связал между собой, все прекрасно работает, пока в запущенной программе не выбираю из DriveComboBox диск e - дисковод cd/dvd. Если в нем нет диска, то программа выдает ошибку ввода-вывода #21 и вылетает. Какое событие нужно обработать, чтоб не позволить программе самовольно прерываться?
yourself вне форума Ответить с цитированием
Старый 10.03.2008, 22:59   #2
Костя КС
Пользователь
 
Аватар для Костя КС
 
Регистрация: 22.01.2008
Сообщений: 78
По умолчанию

можно проверить готов ли диск через функцию

function IsDriveReady(DriveLetter : char) : bool;
var
OldErrorMode : Word;
OldDirectory : string;
begin
OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX );
GetDir(0, OldDirectory);
{$I-}
ChDir(DriveLetter + ':\');
{$I+}
if IoResult <> 0 then
Result := False
else
Result := True;

ChDir(OldDirectory);
SetErrorMode(OldErrorMode);
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
if not IsDriveReady('E') = true then //диск Е
ShowMessage('Drive Not Ready') else
ShowMessage('Drive is Ready');
end;
end.

и сделай так, чтобы программа не выполнялась, если Drive Not Ready
Костя КС вне форума Ответить с цитированием
Старый 10.03.2008, 23:01   #3
Костя КС
Пользователь
 
Аватар для Костя КС
 
Регистрация: 22.01.2008
Сообщений: 78
По умолчанию

Вот, я сделал бы так. при выборе диска, если он доступен - то он открывается.

Код:
uses ShellApi;

var
i : integer;

function IsDriveReady(DriveLetter : char) : bool;
             var
               OldErrorMode : Word;
               OldDirectory : string;
             begin
               OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
               GetDir(0, OldDirectory);
               {$I-}
                 ChDir(DriveLetter + ':\');
               {$I+}
                if IoResult <> 0 then
                 Result := False
                else
                 Result := True;

               ChDir(OldDirectory);
               SetErrorMode(OldErrorMode);
             end;


uses ShellApi;

var
i : integer;

function IsDriveReady(DriveLetter : char) : bool;
var
OldErrorMode : Word;
OldDirectory : string;
begin
OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
GetDir(0, OldDirectory);
{$I-}
ChDir(DriveLetter + ':\');
{$I+}
if IoResult <> 0 then
Result := False
else
Result := True;
ChDir(OldDirectory);
SetErrorMode(OldErrorMode);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
i :=0;
end;

procedure TForm1.DriveComboBox1Change(Sender: TObject);
begin
i :=i+1;
if (i mod 2)<>0 then
begin
if not IsDriveReady(form1.DriveComboBox1.Drive) then
ShowMessage('Drive Not Ready')
else
begin
 ShellExecute(0,'explore', Pchar(form1.DriveComboBox1.Drive +':\'), nil, nil, SW_SHOWNORMAL);
end;
end;
end;
end.
по неизвестной мне причине у меня событие DriveComboBox1Change выполняется два раза подряд.
по этому я там if (i mod 2)<>0 then приписал, чтобы через раз выполнялось.

У меня работает, надеюсь помог... хотя наверняка есть способ проще

Последний раз редактировалось Костя КС; 11.03.2008 в 20:58.
Костя КС вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти ошибку (Delphi) Rigard Помощь студентам 4 23.07.2008 03:06
Как обработать исключение? XPAiN БД в Delphi 9 16.05.2008 15:09
Как в Си обработать нажатие управлавляющих клавиш ? feranic Общие вопросы C/C++ 5 14.04.2008 19:20
Оператор безусловного перехода Смирнов Алексей Паскаль, Turbo Pascal, PascalABC.NET 3 16.10.2007 19:37