关于驱动器检测(100分)

  • 主题发起人 主题发起人 马云飞
  • 开始时间 开始时间

马云飞

Unregistered / Unconfirmed
GUEST, unregistred user!
我编写的一个程序中使用了DIRVECOMBOBOX一个对象
和一个DIRECTORYLISTBOX对象通过DIRVECOMBOBOX的
ONCHANGE事件来选择驱动器,同时将这个驱动器传给
DIRECTORYLISTBOX的DRIVE属性,但是如果是光驱的
话,假如光驱没准备好的话就会出现错误,倒致出
现程序终止运行。我想问的是如何来检测光驱是否准
备好,是通过一个过程和函数或是通过自己编写的代
码实现。
 
try
...
except
未准备好
end;
 
这样试试:
function TForm1.CDinCDROMDrive(DriveLetter: Char): Boolean;
var
Mask: string[6];
SearchRec: TSearchRec;
SaveErrorMode: Cardinal;
begin
SaveErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
Mask:= DriveLetter + ':/*.*';
{$I-}
if FindFirst(Mask, faAnyfile, SearchRec) = 0
then
CDinCDROMDrive := True
else
CDinCDROMDrive := False;
{probably -18}
FindClose(SearchRec);
{for 32-bit compatibility}
{$I+}
SaveErrorMode := SetErrorMode(SaveErrorMode);
{Reset it}
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if CDinCDROMDrive('D') then
ShowMessage('CDROM准备好!')
else
ShowMessage('CDROM未准备好!')
end;
 
TDriveComboBox有一个DirList属性,将它设为你所用的DirectoryListBox,当
改变驱动器时目录列表也会自动改变更新,如果驱动器未准备好,它会产生一
个Exception,用try...except...end来捕获它,再进行处理。
 
function DiskInDrive(Drive: Char): Boolean;
var
ErrorMode: word;
begin
if Drive in ['a'..'z'] then
Dec(Drive, $20);
if not (Drive in ['A'..'Z']) then
raise EConvertError.Create('Not a valid drive ID');
ErrorMode := SetErrorMode(SEM_FailCriticalErrors);
try
{ drive 1 = a, 2 = b, 3 = c ... }
if DiskSize(Ord(Drive) - $40) = -1 then
Result := False
else
Result := True;
finally
SetErrorMode(ErrorMode);
end;
end;

然后: if DiskInDrive('E') then
showmessage('OK!');
注:'E'为光驱盘符.
 
但是如果Delhi 的自动监测异常错误会先于try ..except..end
报错,如何关掉自动监测
 
有消息wm_devicechange
 
多人接受答案了。
 
后退
顶部