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
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.