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.