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.