Tengo una aplicación a la cual le he incluido un componente Drivecombobox y un DirectoryListBox. Necesito capturar una excepción para cuando no este preparada la unidad de disco flexible o de disco extraíble, y si no esta preparada que mande un mensaje personalizado, ya intente poner algunas instrucciones (try.. Except)en el evento Onchange del Drivecombobox pero no he tenido éxito.
Respuesta de antipauli
1
1
antipauli, Analista/Programador de Sistemas Oracle
Aquí tienes varias cosas para probar... 1... procedure TForm1.MydrivecomboboxChange(Sender: TObject); begin try Mydirectorylistbox.drive := Mydrivecombobox.drive; except on EInOutError do messagedlg(#13 + 'the selected drive, or device is not ready'+ #13, mtwarning, [mbok], 0); end; end; 2.......... En el Evento onChange de DriveComboBox: Try ChDir(cbDrive.drive+':'); Except MessageDlg('La unidad especificada no está lista',mtError,[mbOK],0); cbDrive.Drive := GetCurrentDir[1]; End; 3.......... procedure TForm1.DriveComboBox1Change(Sender: TObject); begin try DirectoryListBox1.Drive := DriveComboBox1.Drive; except MessageDlg('The drive is not ready!',mtError,[mbOK],0); end; end; 4.......... procedure TForm1.DriveComboBox1Change(Sender: TObject); begin if DirectoryExists(DriveComboBox1.Drive+':\') then DirectoryListBox1.Drive := DriveComboBox1.Drive else { reset DriveComboBox1.Drive to something if you want } end; 5.......... Es del truco [34] de Trucomania (www.q3.nu) function DiskInDrive(Drive: Char): Boolean; var ErrorMode: word; begin { make it upper case } if Drive in ['a'..'z'] then Dec(Drive, $20); { make sure it's a letter } if not (Drive in ['A'..'Z']) then raise EConvertError.Create('Not a valid drive ID'); { turn off critical errors } ErrorMode := SetErrorMode(SEM_FailCriticalErrors); try { drive 1 = a, 2 = b, 3 = c, etc. } if DiskSize(Ord(Drive) - $40) = -1 then Result := False else Result := True; finally { restore old error mode } SetErrorMode(ErrorMode); end; end; Un ejemplo de cómo llamarla: if DiskInDrive('a') then... Esta es más guay: if FileExists('a:\NUL') then ShowMessage('Disco A preparado') {Drive Ready} else ShowMessage('Disco A NO preparado'); {Drive NOT Ready} Es del truco [62] de Trucomania (www.q3.nu) Para hacer lo que pide, lo del DriveCombo... supongo que además del DriveCombo usará un DirectoryListBox y un FileListBox y los tendrá enlazados... De por sí, la DriveComboBox no da error al seleccionar la disquetera... es la DirectoryBox o la FileListBox la que da error al intentar pillar los directorios y ficheros que tiene... Así que... con interceptar la unión DriveComboBox -> DirectoryListBox y chequear la unidad... se acabo el problema: Pon esto en el OnChange de la DriveComboBox: procedure TForm1.DriveComboBox1Change(Sender: TObject); begin If FileExists(DriveComboBox1.Drive+':\NUL') then DirectoryListBox1.Drive:=DriveComboBox1.Drive; end; Y borra la propiedad DirList de DriveComboBox1