Acessando e Programando o Disquete

 

Disco no Unidade A: (ou B:) Disquete?

Sim, poderia haver uma situação em que precisaremos acessar e operar o disquete programaticamente, mesmo hoje.

SetErrorMode

A função API SetErrorMode, controla como o sistema operacional trata vários tipos de erros sérios. Quando SEM_FAILCRITICALERRORS for habilitado, o sistema operacional não exibe a caixa de mensagem critical-error-handler quando um erro acontecer. Em lugar disto, o sistema operacional envia o erro para o processo chamador.

DiskSize

A função DiskSize retorna o tamanho em bytes do número da unidade especificada, onde 0 = Atual, 1 = A, 2 = B, etc. DiskSize retorna -1 se o número da unidade for inválido.

DiskFree

A função DiskFree retorna o número de bytes livres no número da unidade especificada, onde 0 = Atual, 1 = A, 2 = B e assim por diante. DiskFree retorna -1 se o número da unidade for inválido.

SHFormatUnidade

A função SHFormatUnidade não está documentada nos arquivos de ajuda, nem é declarada no Delphi. Teremos que declarar esta função no Shell32.dll, a qual fornece acesso à caixa de diálogo de formatação do Windows. Para declarar funções em uma DLL, sufixamos a palavra reservada external e o nome da DLL ao fim de um procedimento normal ou de um cabeçalho de função (function header). Também teremos que adicionar convenções de chamada de stdcall, pois estamos utilizando uma DLL da API WIN32. Como só estamos utilizando esta função nesta unit, fazemos a declaração logo antes do procedimento que a utilizará.

O Disco está na Unidade?

Antes de tentar salvar ou carregar um arquivo, podemos verificar “silenciosamente” se existe um disquete na unidade e apresentar ao usuário uma mensagem de erro significativa, em lugar de uma caixa de erro crítico do Windows.

 

procedure TForm1.Button1Click(Sender: TObject).

var

   EMode: Word;

begin

  EMode := SetErrorMode(SEM_FAILCRITICALERRORS) ;

  try

    if DiskSize(Ord('A')-$40) <> -1 then

      ShowMessage('Disk in drive A: !')

    else

      ShowMessage('No disk in drive A: !') ;

  finally

    SetErrorMode(EMode) ;

  end;

end;

Espaço Livre em Disco

Se precisarmos fazer um backup de um disquete, seria bom verificar antes o espaço livre disponível no disco.

 

procedure TForm1.Button2Click(Sender: TObject);

var

   Drive: Byte;

   sFD, sSD: string;

   DFree, DSize : int64;

begin

  Drive:=1;

  DFree:=DiskFree(Drive) ;

  DSize:=DiskSize(Drive) ;

  if (DFree <> -1) and (DSize <> -1) then

  begin

    sFD:='Disk Free: '+IntToStr(DFree div 1024)+' Kb';

    sSD:='Disk Size: '+IntToStr(DSize div 1024)+' Kb';

    ShowMessage(sFD + #13 + sSD) ;

  end;

end;

Formatação Windows

A idéia aqui é tratar a formatação de disco, utilizando a mesma caixa de diálogo utilizada pelo Shell. Se quisermos, poderemos até utilizar silenciosamente a função de formatação do DOS.

 

Nota: Acrescente ShellApi à cláusula uses da unit.

 

procedure TForm1.Button4Click(Sender: TObject);

const

   SHFMT_DRV_A = 0;

   SHFMT_DRV_B = 1;

   SHFMT_ID_DEFAULT = $FFFF;

   SHFMT_OPT_QUICKFORMAT = 0;

   SHFMT_OPT_FULLFORMAT = 1;

   SHFMT_OPT_SYSONLY = 2;

   SHFMT_ERROR = -1;

   SHFMT_CANCEL = -2;

   SHFMT_NOFORMAT = -3;

var

   FmtRes : LongInt;

begin

  try

   FmtRes:=ShFormatDrive(Handle,

     SHFMT_DRV_A,

     SHFMT_ID_DEFAULT,

     SHFMT_OPT_QUICKFORMAT) ;

   case FmtRes of

    SHFMT_ERROR:

     ShowMessage('Error formatting the drive') ;

    SHFMT_CANCEL:

     ShowMessage('User canceled formatting the drive') ;

    SHFMT_NOFORMAT:

     ShowMessage('Unidade is not formatable')

   else

     ShowMessage('Disk has been formatted') ;

   end;

  except

   ShowMessage('Error occurred!')

  end;

end;

Finalizando

Em alguns casos, precisaremos manipular o disquete. Essas funções estão aqui para ajudar-nos a economizar o tempo e a energia que estaríamos de outra forma gastando na procura da solução correta. Não há porque apavorar-se caso algum código aqui apresentado seja difícil de entender, é necessário apenas dedicar algum tempo ao assunto, e logo veremos que as API do Windows não são tão difíceis quanto parecem.

 

Nota: é muito fácil de implementar esses procedimentos (alguns deles) para trabalhar com CD-ROM ou qualquer outra mídia removível.