Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda con error en DriveComboBox (https://www.clubdelphi.com/foros/showthread.php?t=84352)

danielmj 08-10-2013 23:49:49

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.

ecfisa 09-10-2013 01:14:59

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 :)

danielmj 09-10-2013 11:21:10

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.

ecfisa 10-10-2013 06:21:48

1 Archivos Adjunto(s)
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 :)

danielmj 10-10-2013 09:43:51

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.

danielmj 10-10-2013 13:58:32

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.

ecfisa 11-10-2013 03:15:33

Cita:

Empezado por danielmj (Mensaje 468125)
¿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 :)

danielmj 13-10-2013 15:18:24

Hola ecfisa, perdona por tardar en responder. Ya probe tu código para que se muestren solo los discos duros, funciona perfectamente. Gracias.

Saludos.


La franja horaria es GMT +2. Ahora son las 09:40:05.

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