Delphi Programming / Object Pascal
ロゴマーク
[掲載 2012年07月24日] [更新 2012年07月24日] Delphi サンプルプログラム集
085_CR-ROM ドライブの検出とトレーの開閉
動作確認等 Windows XP(SP3) + Delphi XE Pro
Windows 7 U64(SP1) + Delphi XE Pro
085_cdrom_OpenClose.zip [591 KB] 2012年07月24日版 (EXE 同梱)







CR-ROM ドライブの検出とトレーの開閉


システムで有効な CD-ROM ドライブを列挙し,そのドライブのトレーの開閉を行うサンプルです.
CR-ROM や DVD がセットされている場合は,ダイアログを表示します.CD-ROM となっていますが,実際には DVD 等のドライブでも動作します.
Delphi も,ダウンロード版での購入ができる時代となっています.クラウドコンピューティングの普及に伴い,USB,CD-ROM や DVD 等の可搬性のメディアの需要は減少していくのかも知れません.

このサンプルで使用している mciSendString 関数は,Windows マルチメディア関係の関数で,サウンドファイル (音楽ファイル) 等,マルチメディアファイルの再生制御に使用されています.


図1
設計時画面
図2
起動時の画面
  • CD-ROM (DVDも含む) ドライブだけを列挙
図3
[閉じる]
  • ディスクがトレーにある場合
  • ない場合は閉じても表示されない
図4
[開く]
  • ディスクがトレーにある場合
  • ない場合は開いても表示されない

リスト1
CR-ROM ドライブの検出とトレーの開閉
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    ListBox1: TListBox;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    procedure FormCreate(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
  protected
    procedure WMDevicechange(var Message: TMessage); message WM_DEVICECHANGE;
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses MMSystem;

{$R *.DFM}

//=============================================================================
//  フォーム生成時の処理
//
//  システムに有効なドライブの内,CD-ROMドライブだけを列挙
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
  LogDrives : Cardinal;
  i         : Integer;
  DriveName : String;
begin
  ListBox1.Style      := lbOwnerDrawFixed;
  ListBox1.ItemHeight := 15;

  //現在使用可能なディスクドライブのビットマスクを取得
  LogDrives := GetLogicalDrives;

 //ドライブ名の列挙
  //ドライブの最大数は25(A-Z)
  for i := 0 to 25 do begin
  if (LogDrives and(1 shl i)) <> 0 then begin
    DriveName := Char(Ord('A') + i) + ':\';

      //CD-ROMドライブだけをリスト
      if GetDriveType(PChar(DriveName)) = DRIVE_CDROM then begin
        ListBox1.Items.Add(DriveName);
      end;
    end;
  end;
end;

//-----------------------------------------------------------------------------
//  mciSendString関数を使用したCD-ROMドライブの開閉用関数
//  Drive   : ドライブ名(C:\, D:\,..のように与える
//  flgOpen : True の時は開く.Falseの時は閉じる
//
//  usesにMMSystemが必要
//-----------------------------------------------------------------------------
procedure OpenCloseCDROMDrive(Drive: String; flgOpen: Boolean);
var
  CmdStr : String;
begin
  CmdStr := 'open ' + ExcludeTrailingPathDelimiter(Drive) +
            ' type cdaudio alias cdromdrive';

  mciSendString(PChar(CmdStr), nil, 0, 0);
  try
    if flgOpen then begin
      mciSendString('set cdromdrive door open', nil, 0, 0);
    end else begin
      mciSendString('set cdromdrive door Closed', nil, 0, 0);
    end;
  finally
    mciSendString('close cdromdrive', nil, 0, 0);
  end;
end;

//=============================================================================
//  CD-ROM ドライブのトレーを開く
//=============================================================================
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
   if ListBox1.ItemIndex < 0 then exit;
   OpenCloseCDROMDrive(ListBox1.Items[ListBox1.ItemIndex], True);
end;

//=============================================================================
//  CD-ROM ドライブのトレーを閉じる
//=============================================================================
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
   if ListBox1.ItemIndex < 0 then exit;
   OpenCloseCDROMDrive(ListBox1.Items[ListBox1.ItemIndex], False);
end;

//=============================================================================
//  WM_DEVICECHANGEメッセージの処理
//  エラーの場合の処理はなし
//
//  定数値はMSDNの記事による(Delphi XEに定義はない)
//=============================================================================
procedure TForm1.WMDevicechange(var Message: TMessage);
const
  DBT_CONFIGCHANGECANCELED    = $0019;
  DBT_CONFIGCHANGED           = $0018;
  DBT_CUSTOMEVENT             = $8006;
  DBT_DEVICEARRIVAL           = $8000;
  DBT_DEVICEQUERYREMOVE       = $8001;
  DBT_DEVICEQUERYREMOVEFAILED = $8002;
  DBT_DEVICEREMOVECOMPLETE    = $8004;
  DBT_DEVICEREMOVEPENDING     = $8003;
  DBT_DEVICETYPESPECIFIC      = $8005;
  DBT_DEVNODES_CHANGED        = $0007;
  DBT_QUERYCHANGECONFIG       = $0017;
  DBT_USERDEFINED             = $FFFF;

var
  StrText : String;
begin
  inherited;

  StrText := '';
  case Message.WParam of
    DBT_DEVICEARRIVAL:        StrText := 'ディスクがセットされました';
    DBT_DEVICEREMOVECOMPLETE: StrText := 'ディスクが取り出されました';
  end;
  if StrText <> '' then MessageDlg(StrText, mtInformation, [mbOK], 0);
end;

end.