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.