unit dosform;
interface
uses winprocs, wintypes, windos, dvcrt, dvwin,
     dosgeral, dosmsg, dosproc, dosed;

procedure formataDisquete;

implementation

{--------------------------------------------------------}
{                  formata um disquete
{--------------------------------------------------------}

procedure formataDisquete;
var drive, dens: char;
    c, c2: char;
    comando, param, nomeDir: string;
    nomeDisquete: string;
    arq: text;
    rapida: boolean;

    {--------------------------------------------------------}

    function erroFormat: boolean;
    var s: string;
    begin
        assign (arq, 'c:\dos.$$$');
        reset (arq);
        erroFormat := true;
        while not eof (arq) do
            begin
                readln (arq, s);
                if (upcase (s[1]) = 'N') and (upcase (s[2]) = 'O') and (upcase (s[3]) = 'M') then
                    erroFormat := false;
            end;
        close (arq);
    end;

    {--------------------------------------------------------}

begin
    mensagem (DVINFUNI, 0);
    pegaTeclado (c, c2);
    soletra (c, 1);
    drive := upcase (c);

    if not (drive in ['A','B']) then
        begin
            mensagem (DVDRVINV, 1);    { drive invalido }
            exit;
        end;

    mensagem (DVFORRAP, 0);
    pegaTeclado (c, c2);
    soletra (c, 1);
    rapida := upcase (c) <> 'N';

    mensagem (DVNOMDSK, 0);
    nomeDisquete := '';
    c := sintEdita (nomeDisquete, wherex, wherey, 10, true);
    writeln;

    mensagem (DVINSDSK, 1);    {insira o disquete e tecle enter}
    repeat
        c := readkey;
    until (c = #$1b) or (c = #$0d);
    if c = #$1b then
        begin
            mensagem (DVFORCAN, 1);   { formatacao cancelada }
            exit;
        end;

    assign (arq, 'c:\cmd.$$$');
    rewrite (arq);
    writeln (arq);
    writeln (arq, nomeDisquete);
    writeln (arq, 'n');
    close (arq);

    assign (arq, 'c:\dos.$$$');
    {$I-}  erase (arq);  {$I-}
    if ioresult <> 0 then;   { ignora }

    comando := 'command';
    param := 'format ' + drive + ': /u';
    if rapida then
        param := param + ' /q';

    param := '/c ' + param + ' < c:\cmd.$$$ > c:\dos.$$$';

    nomeDir := 'c:\';
    while sintFalando do;
    calaboca;
    if executaProg (comando, nomeDir, param, SW_SHOWMINIMIZED) then
        esperaProgVoltar;

    delay (2000);
    while keypressed do readkey;

    if erroFormat then
        mensagem (DVPROFRM, 1)    { problemas na formatação }
    else
        mensagem (DVFORFIM, 1);   { disquete bem formatado }

    mensagem (DVLEREL, 0);   { Quer ler relatorio de formatacao ? }
    pegaTeclado (c, c2);
    soletra (c, 1);
    if upcase (c) = 'S' then
        begin
            mensagem (DVLEITEL, 1);
            while sintFalando do;
            editarLerArquivo ('c:\dos.$$$ /d', 2);
        end;
end;

end.
