15 мая "Исходники.РУ" отмечают 20-летие присутствия в сети!
Поздравляем всех причастных и неравнодушных с юбилеем сайта!
И огромное спасибо всем, кто был с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту




Как проверить, есть ли диск в дисководе (или CD-ROM-e)

Способ 1:

Следующая функция в качестве параметра принимает букву диска. Возвращаемое значение сигнализирует о наличие диска в дисководе или отсутствии:

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
      { диск 1 = a, 2 = b, 3 = c, и т.д. }
      if DiskSize(Ord(Drive) - $40) = -1 then
         Result := False
      else
         Result := True;
   finally
      { восстанавливаем старый режим ошибок }
      SetErrorMode(ErrorMode);
   end;
end;

 

Способ 2:

Для этого можно воспользоваться функцией SetErrorMode, при помощи которой можно получить необходимую информацию.


function DiskInDrive(lw: Char ): integer;
var
  sRec: TSearchRec;
  res: integer;

begin
  Result:= 0;
  SetErrorMode(SEM_FAILCRITICALERRORS);  
  result := False;
  {$I-}
    res := FindFirst(lw + ':\*.*', faAnyfile, SRec );
    FindClose(SRec);  
  {$I+}
  case res of
     0     : Result := 0;  
     2,18  : Result := 1;
     21,3  : Result := 2;
  else
    Result := res;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  x: integer;

begin
  x := DiskInDrive('a');
  case x of
    0: ShowMessage('Disk is there !');
    1: ShowMessage('Disk is empty !');
    2: ShowMessage('No disk in drive !');
  else
       ShowMessage('Disk not formatted !');
  end; //case
end;