Ir para o conteúdo

Desafio 5 - proposta de resolução avançada

No âmbito deste desafio colocado junto dos utilizadores de Pascal e Delphi do P@P, o membro nunopicado propôs a seguinte proposta de resolução que respeita as normas, mas que recorre a métodos não abordados ou até ao momento em que o Desafio 5 é colocado ou em todo o Tutorial.

program Desafio5;

{$APPTYPE CONSOLE}

uses
  SysUtils, IniFiles, Crt;

type // Record DB
    TEuroPass = Record
      Pessoal:Record
        Nome,
        Morada,
        Telefone,
        Fax,
        Email,
        Nacionalidade,
        DataNascimento,
        Sexo:String;
      End;
      EmpregoPretendido:String;
      Experiencia:Record
        Datas,
        Cargo,
        Actividades,
        Empregador,
        TipoEmpresa:String;
      End;
      Formacao:Record
        Datas,
        Designacao,
        Disciplinas,
        Organizacao,
        Nivel:String;
      End;

    End;

var
   CV:TEuroPass;  // Record
   fCV:TIniFile;  // Ficheiro de dados

procedure SaveCV(FileName:String);
// Guarda o record num ficheiro
begin
     fCV:=TIniFile.Create(FileName);
     try
        fCV.WriteString('Pessoal','Nome',CV.Pessoal.Nome);
        fCV.WriteString('Pessoal','Morada',CV.Pessoal.Morada);
        fCV.WriteString('Pessoal','Telefone',CV.Pessoal.Telefone);
        fCV.WriteString('Pessoal','Fax',CV.Pessoal.Fax);
        fCV.WriteString('Pessoal','Email',CV.Pessoal.Email);
        fCV.WriteString('Pessoal','Nacionalidade',CV.Pessoal.Nacionalidade);
        fCV.WriteString('Pessoal','DataNascimento',CV.Pessoal.DataNascimento);
        fCV.WriteString('Pessoal','Sexo',CV.Pessoal.Sexo);
        fCV.WriteString('Comum','EmpregoPretendido',CV.EmpregoPretendido);
        fCV.WriteString('Experiencia','Datas',CV.Experiencia.Datas);
        fCV.WriteString('Experiencia','Cargo',CV.Experiencia.Cargo);
        fCV.WriteString('Experiencia','Actividades',CV.Experiencia.Actividades);
        fCV.WriteString('Experiencia','Empregador',CV.Experiencia.Empregador);
        fCV.WriteString('Experiencia','TipoEmpresa',CV.Experiencia.TipoEmpresa);
        fCV.WriteString('Formacao','Datas',CV.Formacao.Datas);
        fCV.WriteString('Formacao','Designacao',CV.Formacao.Designacao);
        fCV.WriteString('Formacao','Disciplinas',CV.Formacao.Disciplinas);
        fCV.WriteString('Formacao','Organizacao',CV.Formacao.Organizacao);
        fCV.WriteString('Formacao','Nivel',CV.Formacao.Nivel);
     finally
        fCV.Free;
     end;
end;

procedure LoadCV(FileName:String);
// Lê os dados de um ficheiro para o record
begin
     fCV:=TIniFile.Create(FileName);
     try
        CV.Pessoal.Nome:=fCV.ReadString('Pessoal','Nome','');
        CV.Pessoal.Morada:=fCV.ReadString('Pessoal','Morada','');
        CV.Pessoal.Telefone:=fCV.ReadString('Pessoal','Telefone','');
        CV.Pessoal.Fax:=fCV.ReadString('Pessoal','Fax','');
        CV.Pessoal.Email:=fCV.ReadString('Pessoal','Email','');
        CV.Pessoal.Nacionalidade:=fCV.ReadString('Pessoal','Nacionalidade','');
        CV.Pessoal.DataNascimento:=fCV.ReadString('Pessoal','DataNascimento','');
        CV.Pessoal.Sexo:=fCV.ReadString('Pessoal','Sexo','');
        CV.EmpregoPretendido:=fCV.ReadString('Comum','EmpregoPretendido','');
        CV.Experiencia.Datas:=fCV.ReadString('Experiencia','Datas','');
        CV.Experiencia.Cargo:=fCV.ReadString('Experiencia','Cargo','');
        CV.Experiencia.Actividades:=fCV.ReadString('Experiencia','Actividades','');
        CV.Experiencia.Empregador:=fCV.ReadString('Experiencia','Empregador','');
        CV.Experiencia.TipoEmpresa:=fCV.ReadString('Experiencia','TipoEmpresa','');
        CV.Formacao.Datas:=fCV.ReadString('Formacao','Datas','');
        CV.Formacao.Designacao:=fCV.ReadString('Formacao','Designacao','');
        CV.Formacao.Disciplinas:=fCV.ReadString('Formacao','Disciplinas','');
        CV.Formacao.Organizacao:=fCV.ReadString('Formacao','Organizacao','');
        CV.Formacao.Nivel:=fCV.ReadString('Formacao','Nivel','');
     finally
        fCV.Free;
     end;
end;

procedure WriteXY(Text:String;X,Y:Byte;Align:Char);
// Escreve uma string na posição indicada, alinhando conforme o estabelecido (E = Esquerda, C = Centro, D = Direita)
begin
     case Align of
          'C':X:=X-(Length(Text) div 2);
          'D':X:=X-Length(Text);
     end;
     GotoXY(X,Y);
     Write(Text);
end;

procedure ReadXY(var Text:String;X,Y:Byte);
// Lê uma string numa determinada posição. Se nada for inserido, assume o valor preexistente
var
   s:String;
begin
     GotoXY(X,Y);
     Readln(s);
     if s<>'' then Text:=s;
     GotoXY(X,Y);
end;

Procedure HLine(x1,y,x2:Byte);
// Desenha uma linha horizontal
var
   x:byte;
begin
     for x := x1 to x2 do
         WriteXY('=',x,y,'E');
end;

procedure InitCV;
// Inicializa o record
begin
     with CV do
          begin
              Pessoal.Nome:='';
              Pessoal.Morada:='';
              Pessoal.Telefone:='';
              Pessoal.Fax:='';
              Pessoal.Email:='';
              Pessoal.Nacionalidade:='';
              Pessoal.DataNascimento:='';
              Pessoal.Sexo:='';
              EmpregoPretendido:='';
              Experiencia.Datas:='';
              Experiencia.Cargo:='';
              Experiencia.Actividades:='';
              Experiencia.Empregador:='';
              Experiencia.TipoEmpresa:='';
              Formacao.Datas:='';
              Formacao.Designacao:='';
              Formacao.Disciplinas:='';
              Formacao.Organizacao:='';
              Formacao.Nivel:='';
          end;
end;

procedure EditaCV;
// Edita um CV
// Se encontrar um CV para o nome inserido, recolhe os valores dos restantes campos para consulta e/ou edição
var
   TitleX:Byte;
   SaveOP:Char;
begin
     TitleX:=17;
     Repeat
           InitCV;

           // Desenha os campos
           ClrScr;
           TextColor(15);
           WriteXY('EuroPass Editor v1',2,1,'E');
           WriteXY('Experiencia profissional',3,10,'E');
           WriteXY('Educacao/Formacao',3,15,'E');
           HLine(2,2,79);
           TextColor(14);
           WriteXY('Nome:',TitleX,3,'D');
           WriteXY('Morada:',TitleX,4,'D');
           WriteXY('Telefone:',TitleX,5,'D');
           WriteXY('Fax:',TitleX+20,5,'D');
           WriteXY('Email:',TitleX+40,5,'D');
           WriteXY('Nacionalidade:',TitleX,6,'D');
           WriteXY('Nascimento:',TitleX+30,6,'D');
           WriteXY('Sexo (M/F):',TitleX+58,6,'D');
           WriteXY('Emprego Pretendido:',TitleX+5,8,'D');
           WriteXY('Datas:',TitleX,11,'D');
           WriteXY('Cargo:',TitleX+40,11,'D');
           WriteXY('Actividades:',TitleX,12,'D');
           WriteXY('Empregador:',TitleX+40,12,'D');
           WriteXY('Tipo de Empresa:',TitleX+40,13,'D');
           WriteXY('Datas:',TitleX,16,'D');
           WriteXY('Designacao:',TitleX+40,16,'D');
           WriteXY('Disciplinas:',TitleX,17,'D');
           WriteXY('Organizacao:',TitleX+40,18,'D');
           WriteXY('Nível de Formacao:',TitleX+40,18,'D');
           WriteXY('Guardar (S/N): ',76,25,'D');
           TextColor(7);

           // Lê o nome
           ReadXY(CV.Pessoal.Nome,TitleX+1,3);
           // Se não for inserido um nome, termina o programa
           if CV.Pessoal.Nome='' then break;

           // Se existir um CV para o nome inserido...
           if FileExists(ExtractFilePath(ParamStr(0))+'CV'+CV.Pessoal.Nome+'.TXT')
              then begin
                        //... faz a leitura para o record
                        LoadCV(ExtractFilePath(ParamStr(0))+'CV'+CV.Pessoal.Nome+'.TXT');

                        // Apresenta os valores
                        WriteXY(CV.Pessoal.Morada,TitleX+1,4,'E');
                        WriteXY(CV.Pessoal.Telefone,TitleX+1,5,'E');
                        WriteXY(CV.Pessoal.Fax,TitleX+21,5,'E');
                        WriteXY(CV.Pessoal.Email,TitleX+41,5,'E');
                        WriteXY(CV.Pessoal.Nacionalidade,TitleX+1,6,'E');
                        WriteXY(CV.Pessoal.DataNascimento,TitleX+31,6,'E');
                        WriteXY(CV.Pessoal.Sexo,TitleX+59,6,'E');
                        WriteXY(CV.EmpregoPretendido,TitleX+6,8,'E');
                        WriteXY(CV.Experiencia.Datas,TitleX+1,11,'E');
                        WriteXY(CV.Experiencia.Cargo,TitleX+41,11,'E');
                        WriteXY(CV.Experiencia.Actividades,TitleX+1,12,'E');
                        WriteXY(CV.Experiencia.Empregador,TitleX+41,12,'E');
                        WriteXY(CV.Experiencia.TipoEmpresa,TitleX+41,13,'E');
                        WriteXY(CV.Formacao.Datas,TitleX+1,16,'E');
                        WriteXY(CV.Formacao.Designacao,TitleX+41,16,'E');
                        WriteXY(CV.Formacao.Disciplinas,TitleX+1,17,'E');
                        WriteXY(CV.Formacao.Organizacao,TitleX+41,18,'E');
                        WriteXY(CV.Formacao.Nivel,TitleX+41,18,'E');
                   end;

           // Lê os novos valores para cada campo (<enter> mantém o valor inalterado)
           ReadXY(CV.Pessoal.Morada,TitleX+1,4);
           ReadXY(CV.Pessoal.Telefone,TitleX+1,5);
           ReadXY(CV.Pessoal.Fax,TitleX+21,5);
           ReadXY(CV.Pessoal.Email,TitleX+41,5);
           ReadXY(CV.Pessoal.Nacionalidade,TitleX+1,6);
           ReadXY(CV.Pessoal.DataNascimento,TitleX+31,6);
           ReadXY(CV.Pessoal.Sexo,TitleX+59,6);
           ReadXY(CV.EmpregoPretendido,TitleX+6,8);
           ReadXY(CV.Experiencia.Datas,TitleX+1,11);
           ReadXY(CV.Experiencia.Cargo,TitleX+41,11);
           ReadXY(CV.Experiencia.Actividades,TitleX+1,12);
           ReadXY(CV.Experiencia.Empregador,TitleX+41,12);
           ReadXY(CV.Experiencia.TipoEmpresa,TitleX+41,13);
           ReadXY(CV.Formacao.Datas,TitleX+1,16);
           ReadXY(CV.Formacao.Designacao,TitleX+41,16);
           ReadXY(CV.Formacao.Disciplinas,TitleX+1,17);
           ReadXY(CV.Formacao.Organizacao,TitleX+41,18);
           ReadXY(CV.Formacao.Nivel,TitleX+41,18);

           // Confirma a gravação
           GotoXY(77,25);
           repeat
             SaveOp:=Upcase(readkey);
           until SaveOP in ['S','N'];
           write(SaveOP);
           if SaveOP = 'S'
              then SaveCV(ExtractFilePath(ParamStr(0))+'CV'+CV.Pessoal.Nome+'.TXT'); // Grava o record para o ficheiro
     Until CV.Pessoal.Nome='';
end;

begin
  try
     EditaCV;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.