Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-10-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Ayuda con error en DriveComboBox

Buenas noches y saludos a todos,

Supongo que esta pregunta es recurrente, pero lo cierto es que he buscado alguna posible solución en otros mensajes relacionados en el foro y no encuentro nada que me aclare las dudas o me envía a trucomanía pero ya no existe la página.

El problema es que si selecciono una unidad que no esté preparada por que no tenga disco insertado, me tira un error y por mucho que he mirado en la web, no me aclaro.

Entonces:

1º ¿Hay algún procedimiento que evite este error?
2º ¿Sería posible que el DriveComboBox unicamente muestre las unidades "útiles" de la máquina? De este modo evitaría tener que mostrar mensajes al capturar errores.

Gracias de antemano.
Responder Con Cita
  #2  
Antiguo 09-10-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola danielmj.

Proba de este modo:
Código Delphi [-]
unit ...
{$WARN UNIT_PLATFORM OFF}

...

implementation

function MediaInDrive(Drive: Char): Boolean;
var
  ErrorMode: Word;
begin
  ErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    Result := DiskSize(Ord(Upcase(Drive))-Ord('A')-1) = -1;
  finally
    SetErrorMode(ErrorMode);
  end;
end;


procedure TForm1.DriveComboBox1Change(Sender: TObject);
begin
   with (Sender as TDriveComboBox) do
    if not MediaInDrive(Drive) then
      raise Exception.Create('Inserte un disco en la unidad '+ UpCase(Drive) +':');
end;

...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 09-10-2013 a las 02:02:28.
Responder Con Cita
  #3  
Antiguo 09-10-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Hola ecfisa,

Gracias por responderme, acabo de probar tu código pero sigue dando error (en ejecución), incluso si después del error, selecciono una unidad válida, devuelve el mismo error (Error I/O #21). De todos modos, la acción con el DriveComboBox, será de escritura de una unidad, es decir, si selecciono una unidad de DVD y esta tiene insertado un disco, supuestamente no devolvería ningún error, pero la aplicación no tendrá la posibilidad de "grabar" nada en esa unidad con lo cual, me devolvería otro error distinto del "I/O #21" o simplemente no haría nada. Por eso, me sería más útil, que el DriveComboBox, únicamente mostrase las unidades de disco rígido con sus particiones (se entiende).

Voy a seguir mirando por la red, a ver si doy con la solución y si encuentro algo y me funciona, pongo aquí el código.

Gracias y un saludo.

Última edición por danielmj fecha: 09-10-2013 a las 11:34:16.
Responder Con Cita
  #4  
Antiguo 10-10-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola danieljm.

Habría que ver si es un problema de versiones de Delphi... El código anterior lo probé con buen resultado usando Delphi 7, en Windows Vista, 7 y 8.

Por si pudiera servirte te adjunto los fuentes con que realicé la prueba.

Saludos
Archivos Adjuntos
Tipo de Archivo: zip danieljm.zip (3,3 KB, 6 visitas)
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 10-10-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Hola, estoy trabajando con la versión XE3. De todos modos, estoy intentando que el DriveComboBox muestre solo los discos duros y sus particiones. En cualquier caso, por supuesto que miro tu código y ahí vere el mensaje de error que me de al seleccionar un disco optico e intentar guardar datos en el.

Saludos y gracias.
Responder Con Cita
  #6  
Antiguo 10-10-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Hola ecfisa,

Acabo de ejecutar tu aplicacion y me encuentro con esto:

1º Si selecciono la unidad C, me lee la disquetera, pero no devuelve mensaje de error aunque esté vacía.
2º Si selecciono la unidad E que la tengo como un esclavo y es un disco duro, muestra el mensaje "inserte un disco en la unidad E"

He jugado con los valores de la linea que muestro abajo, pero da error de compilación.
Código Delphi [-]
Result := DiskSize(Ord(Upcase(Drive)) - Ord('A') -1) = -1;

Dicho lo anterior ¿existe alguna forma de que la aplicación reconozca solo los discos duros con sus particiones?

Saludos y gracias.
Responder Con Cita
  #7  
Antiguo 11-10-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por danielmj Ver Mensaje
¿existe alguna forma de que la aplicación reconozca solo los discos duros con sus particiones?
Si.

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  Dev: DWORD;
  Uni: string;
  i  : Integer;
begin
  Dev:= GetLogicalDrives;
  for i:= 1 to 32 do
    if Dev shr i and 1 = 1 then
    begin
      Uni:= Chr(Ord('A') + i) + ':';
      if GetDriveType(PChar(Uni)) = DRIVE_FIXED then
        ComboBox1.Items.Add(Uni);
   end;
  ComboBox1.ItemIndex := 0;
end;

Con respecto al problema que mencionas, ignoro que puede pasarte. Como te comenté me funciona correctamente...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 11-10-2013 a las 04:07:24.
Responder Con Cita
  #8  
Antiguo 13-10-2013
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Hola ecfisa, perdona por tardar en responder. Ya probe tu código para que se muestren solo los discos duros, funciona perfectamente. Gracias.

Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
DriveComboBox para Lazarus viveba Lazarus, FreePascal, Kylix, etc. 4 04-11-2008 13:59:16
Ayuda con Error JerS Varios 3 03-06-2008 15:48:10
drivecombobox,directorylistbox,filelistbox noipa Varios 1 24-01-2006 15:39:35
Validar DriveComboBox pkbza Varios 2 01-06-2004 17:12:27
¿Donde encuentro los DriveComboBox y los FileListBox? en el Delphi 5 aragorneuf Varios 2 05-04-2004 02:27:58


La franja horaria es GMT +2. Ahora son las 15:13:55.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi