ドライブ・ディレクトリ・ファイルの表示選択

 

コンポーネントの関連付け
APIを使って詳細エラーを表示
APIを使って詳細エラーを表示
2/3
2/3

DriveComboBoxDirListプロパティを空欄にし、ドライブ選択時にエラーがなければ、プログラムからDirectoryListBoxDriveプロパティを設定するようにします。

通常DriveComboBoxDirListプロパティDirectoryListBoxを入れておくことでドライブが変更されると、DirectoryListも変更されるようになっていますが、フロッピーの入っていないAドライブを選んだ場合など、エラーが発生してしまいます。
以下のコードでは、選択されたドライブの空き容量を調べるAPI のGetDiskFreeSpaceEX を使い失敗した場合に元のドライブに戻るようにしています。
詳細なエラー情報はAPIのGetLastErrorを使用します。

DriveComboBoxDirListプロパティを空欄にし、DriveComboBox1OnChangeイベントで次のようにコードを記述します。

procedure TForm1.DriveComboBox1Change(Sender: TObject);
var
  str1     : String ;
  err_code : integer ;
  lpDirectoryName           : string;
  lpFreeBytesAvailable      : Int64;
  lpTotalNumberOfBytes      : Int64;
  lpTotalNumberOfFreeBytes  : Int64;
begin
  lpDirectoryName := DriveComboBox1.Drive + ':\' ;
  if  GetDiskFreeSpaceEx(PChar(lpDirectoryName),lpFreeBytesAvailable,
       lpTotalNumberOfBytes,@lpTotalNumberOfFreeBytes) = True then
  begin
    //関数が正常に終了した場合、DirectoryListBox1のドライブを変更
    DirectoryListBox1.Drive := DriveComboBox1.Drive ;
  end else begin
    //詳細なエラー情報取得
    //(GetDiskFreeSpaceExで返されるエラー)
    err_code := GetLastError ;
    case err_code of
      0 : str1 := 'NO_ERROR' ;
      1 : str1 := 'ERROR_INVALID_FUNCTION' ;
      2 : str1 := 'ERROR_FILE_NOT_FOUND' ;
      3 : str1 := 'ERROR_PATH_NOT_FOUND' ;
      4 : str1 := 'ERROR_TOO_MANY_OPEN_FILES' ;
      5 : str1 := 'ERROR_ACCESS_DENIED' ;
      6 : str1 := 'ERROR_INVALID_HANDLE' ;
      7 : str1 := 'ERROR_ARENA_TRASHED' ;
      8 : str1 := 'ERROR_NOT_ENOUGH_MEMORY' ;
      9 : str1 := 'ERROR_INVALID_BLOCK' ;
      10 : str1 := 'ERROR_BAD_ENVIRONMENT' ;
      11 : str1 := 'ERROR_BAD_FORMAT' ;
      12 : str1 := 'ERROR_INVALID_ACCESS' ;
      13 : str1 := 'ERROR_INVALID_DATA' ;
      14 : str1 := 'ERROR_OUTOFMEMORY' ;
      15 : str1 := 'ERROR_INVALID_DRIVE' ;
      16 : str1 := 'ERROR_CURRENT_DIRECTORY' ;
      17 : str1 := 'ERROR_NOT_SAME_DEVICE' ;
      18 : str1 := 'ERROR_NO_MORE_FILES' ;
      19 : str1 := 'ERROR_WRITE_PROTECT' ;
      20 : str1 := 'ERROR_BAD_UNIT' ;
      21 : str1 := 'ERROR_NOT_READY' ;
      22 : str1 := 'ERROR_BAD_COMMAND' ;
      23 : str1 := 'ERROR_CRC' ;
      24 : str1 := 'ERROR_BAD_LENGTH' ;
      25 : str1 := 'ERROR_SEEK' ;
      26 : str1 := 'ERROR_NOT_DOS_DISK' ;
      27 : str1 := 'ERROR_SECTOR_NOT_FOUND' ;
      28 : str1 := 'ERROR_OUT_OF_PAPER' ;
      29 : str1 := 'ERROR_WRITE_FAULT' ;
      30 : str1 := 'ERROR_READ_FAULT' ;
      31 : str1 := 'ERROR_GEN_FAILURE' ;
      32 : str1 := 'ERROR_SHARING_VIOLATION' ;
      33 : str1 := 'ERROR_LOCK_VIOLATION' ;
      34 : str1 := 'ERROR_WRONG_DISK' ;
    else
      str1 := '??' ;
    end ;
    MessageDlg(str1,mtError,[mbOK],0);
    //DriveComboBox1のドライブをDirectoryListBox1のドライブに戻す
    DriveComboBox1.Drive := DirectoryListBox1.Drive ;
  end ;
end;

 


2/3