Jump to content
thoga31

Tutorial 2010 - Desafio 5 [Contribuam!]

Recommended Posts

thoga31

Isto aqui é só tirar dúvidas... Que tal meter mãos à obra por um desafio interessante? B)

O único exercício do meu tutorial que falta receber uma proposta de resolução é o Desafio 5.

O meu objectivo é ver aqui uma agradável troca de ideias sobre a sua resolução, com o objectivo último de encontrar um código que resolva o problema. The point is, quero ter pelo menos uma proposta que não seja exactamente o meu estilo e da minha autoria.

Os devidos créditos serão atribuídos pela resolução do desafio aquando a publicação na Wiki da solução final.

Vamos lá, pessoal! ;)

Investigue sobre o CV (Curriculum Vitae) europeu – o Europass.

Crie um programa que crie um CV deste modelo, cumprindo todos os campos, excepto o da Fotografia.

O programa irá registar os dados do utilizador e, de seguida, irá mostrar por passos o que o utilizador introduziu. No caso de confirmação, deverá gravar o CV num ficheiro TXT cujo nome será “CV_nome”, onde “nome” é o nome do utilizador, sem espaços. Os campos não preenchidos não deverão aparecer no ficheiro.

Caso o utilizador pretenda alterar um campo, tal deverá ser permitido sem que, para tal, seja necessário refazer o CV todo.

Normas:

  • O CV deverá estar registado num só Record, que inclua Records das partes, e dentro de cada parte os seus campos respectivos;
  • O CV só será gravado em ficheiro no fim, aquando a confirmação final por parte do utilizador;
  • O utilizador poderá cancelar o CV a qualquer altura, escrevendo “<cancelar>”;
  • Limite de linhas de código (exclusive comentários e linhas em branco): livre

Link do documento respectivo

P.S.  Não incluam comentários a não ser o número de linhas, excluindo linhas em branco.


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Explica-me lá uma coisa que não percebi...

Queres em record, mas a gravar num txt?

Não estás a falar de record directo portanto, certo? Queres rotinas que convertam os dados do record em txt e vice-versa?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

Explica-me lá uma coisa que não percebi...

Queres em record, mas a gravar num txt?

Não estás a falar de record directo portanto, certo? Queres rotinas que convertam os dados do record em txt e vice-versa?

O objectivo é o seguinte: introduzes todas as informações, e no final podes alterar campos individualmente. Só no momento da confirmação final do utilizador é que encaixas tudo num txt. Até lá, as informações devem estar guardadas no Record.

Na prática: durante a execução do programa, nenhum txt foi criado. No momento em que utilizador diz "sim, está tudo ok", é que aparece o ficheiro - ou seja, a informação é guardada permanentemente no txt só mesmo no fim.

Fiz-me entender? ;)


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Era o que imaginava!

Agora diz-me: Algum formato específico para o txt, ou é PD (Programmer Decision)? ;)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

Era o que imaginava!

Agora diz-me: Algum formato específico para o txt, ou é PD (Programmer Decision)? B)

É PD. Mas claro que o senso-comum diz-nos que deve ser algo semelhante a:

CURRICULUM VITAE MODELO EUROPASS
Visite http:// ...

PARTE 1
  Nome: Igor Nunes
  Data de nascimento: 30 de Fevereiro de 1143 xD
...
PARTE 2
...
Capacidades informáticas: Pascal, ...
...

Não convém ter um amontoado de informação sem nexo ;)


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

OK: formato à descrição logo que tenha pés e cabeça!

Hoje não sei, mas entretanto vou ver o que se arranja!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

É tarde e vou dormir...

Deixa-me dizer-te que, a ideia de ter tudo num record e depois gravar num ficheiro de texto é algo que nem nos sonhos mais loucos (ou pesadelos) me passaria pela cabeça. Abomino a ideia, além de que deixa o código de um amadorismo perfeito!  :wallbash:

Mas pronto... Não está completo, porque é tarde demais para andar a meter campos, mas o fundamento está aqui, e penso que corresponde à ideia.

Alguma alteração necessário, olha... acusem-se! ;)

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.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

@nunopicado, enganei-me à brava e editei o teu tópico em vez de fazer quote. Já não consegui recuperar, nem com a ferramenta própria. 😲

Desculpa lá, podes voltar a meter a tua solução? ;)

(que burrice!) B)


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

????

O post está lá!

Ou não apagaste, ou já o meteste outra vez! :):D


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

????

O post está lá!

Ou não apagaste, ou já o meteste outra vez! :D :D

Confesso que estava com um olho no burro e outro no cigano, aka um no P@P e outro no pré-relatório de Química :)

Quando deixei a mensagem não estava... enfim, milagres da tecnologia. :lamo:

Vou jantar, já venho comentar a tua solução. Até já. :D


Knowledge is free!

Share this post


Link to post
Share on other sites
thoga31

Ok. Tenho algumas coisinhas a apontar :)

A solução está muito boa, tendo em conta as normas. A sério, parabéns. Está mesmo como tinha imaginado.

Excepto numa ou noutra coisinha.

Não te esqueças que este exercício está no âmbito de um tutorial cujo primeiro nome foi "Introdução ao Pascal", e ainda o é apesar da mudança de nome, e que está encaixado numa 4ª parte num total de 7, e está encaixado num capítulo que trata do tipo de dados Text (o link vai lá ter direitinho).

Ou seja, o módulo iniFiles não é suposto existir, bem como o tipo de dados consequente TIniFile. No seu lugar deveria estar um Text.

Mais, a estrutura de tentativa está muito bem aplicada. Certíssimo. Mas esta só é abordada mais à frente na parte 6, capítulo 4. Por isso, esta estrutura é suposta não existir.

Em suma, é um desafio meramente académico, sem previsão de erros nem nada. É só mesmo rever e utilizar os Records encadeados, bem como aplicar o recém tipo de dado Text.

Reforço, nãop tenho nada contra a tua solução! Pelo contrário! Vou mesmo colocá-la em anexo para quem estiver a acabar de ler o tutorial. Mas, para o desafio em si, pretendo a solução enquadrada. :D

Cumps


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Ahhhhh, OK!

lol, já podias ter dito.

Mas queres que ele permita na mesma editar um CV já existente?

Edit: Diga-se de passagem que records encadeados também não será bem iniciação ao pascal! :)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

Versão KISS da solução do post anterior:

program Desafio5Kiss;

{$APPTYPE CONSOLE}

uses
  Crt,
  SysUtils;

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
   F:TextFile;

procedure SaveCV(FileName:String);
// Guarda o record num ficheiro
begin
     AssignFile(F,FileName);  // Artibui o ficheiro à variável
     {$i-}  // Desactiva a gestão de erros de IO
     Rewrite(F);  // Cria o ficheiro
     {$i+}  // Reactiva a gestão de erros de IO
     if IOResult<>0  //Se a última operação IO for diferente de 0 (erro) dá uma mensagem e sai
        then begin
                  Writeln('Não foi possível gravar o EuroPass. . .');
                  Exit;
             end;

     // Grava os dados do record no ficheiro
     Writeln(F,CV.Pessoal.Nome);
     Writeln(F,CV.Pessoal.Morada);
     Writeln(F,CV.Pessoal.Telefone);
     Writeln(F,CV.Pessoal.Fax);
     Writeln(F,CV.Pessoal.Email);
     Writeln(F,CV.Pessoal.Nacionalidade);
     Writeln(F,CV.Pessoal.DataNascimento);
     Writeln(F,CV.Pessoal.Sexo);
     Writeln(F,CV.EmpregoPretendido);
     Writeln(F,CV.Experiencia.Datas);
     Writeln(F,CV.Experiencia.Cargo);
     Writeln(F,CV.Experiencia.Actividades);
     Writeln(F,CV.Experiencia.Empregador);
     Writeln(F,CV.Experiencia.TipoEmpresa);
     Writeln(F,CV.Formacao.Datas);
     Writeln(F,CV.Formacao.Designacao);
     Writeln(F,CV.Formacao.Disciplinas);
     Writeln(F,CV.Formacao.Organizacao);
     Writeln(F,CV.Formacao.Nivel);

     // Fecha o ficheiro
     CloseFile(F);
end;

procedure LoadCV(FileName:String);
// Lê os dados de um ficheiro para o record
begin
     AssignFile(F,FileName);  // Artibui o ficheiro à variável
     {$i-}  // Desactiva a gestão de erros de IO
     Reset(F);  // Abre o ficheiro para leitura
     {$i+}  // Reactiva a gestão de erros de IO
     if IOResult=0  // Se conseguir abrir o ficheiro...
        then begin
                  // Lê os dados do ficheiro para o record
                  Readln(F,CV.Pessoal.Nome);
                  Readln(F,CV.Pessoal.Morada);
                  Readln(F,CV.Pessoal.Telefone);
                  Readln(F,CV.Pessoal.Fax);
                  Readln(F,CV.Pessoal.Email);
                  Readln(F,CV.Pessoal.Nacionalidade);
                  Readln(F,CV.Pessoal.DataNascimento);
                  Readln(F,CV.Pessoal.Sexo);
                  Readln(F,CV.EmpregoPretendido);
                  Readln(F,CV.Experiencia.Datas);
                  Readln(F,CV.Experiencia.Cargo);
                  Readln(F,CV.Experiencia.Actividades);
                  Readln(F,CV.Experiencia.Empregador);
                  Readln(F,CV.Experiencia.TipoEmpresa);
                  Readln(F,CV.Formacao.Datas);
                  Readln(F,CV.Formacao.Designacao);
                  Readln(F,CV.Formacao.Disciplinas);
                  Readln(F,CV.Formacao.Organizacao);
                  Readln(F,CV.Formacao.Nivel);
             end;

     // Fecha o ficheiro
     CloseFile(F);
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,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+1,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+1,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
     EditaCV;
end.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

Ahhhhh, OK!

lol, já podias ter dito.

Mas queres que ele permita na mesma editar um CV já existente?

Edit: Diga-se de passagem que records encadeados também não será bem iniciação ao pascal! :D

Eu referi qual era o desafio e de onde vinha e dei o link, mas de facto podia ter expresso de forma mais directa :D

Não é, e é ao mesmo tempo. Records encadeados não são muito difíceis, penso, e obrigam a uma noção apurada de organização lógica de dados.

Assim pelo menos lês o seguinte:

CV.Pessoal.DataNascimento

Curriculum Vitae > Informação Pessoal > Data de Nascimento  - muito mais organizado para leitura. :D

Versão KISS da solução do post anterior:

[...]

Parece-me uma excelente solução. :)

Mais ninguém quer dar ideias? Simples alterações, por exemplo... Nada?


Knowledge is free!

Share this post


Link to post
Share on other sites
thoga31

1ª versão colocada aqui, na Wiki, em anexo ao Tutorial.

Ainda estás a utilizar uma série de métodos nunca falados no tutorial - FileExists (apesar de ser óbvio), ExtractFilePath, etc etc :D

Mas de tão bom que está, não resisti a colocar na Wiki! :)

Agora, há propostas de alguém em conformidade com o tutorial?


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Eh pá, era preciso que me lembrasse de quando comecei a usar certas coisas, se no Delphi ou ainda no Turbo Pascal! lol


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

Eh pá, era preciso que me lembrasse de quando comecei a usar certas coisas, se no Delphi ou ainda no Turbo Pascal! lol

Confesso que, mesmo não tendo os teus conhecimentos, também já sinto dificuldade em manter um nível básico para ensinar as mentes mais jovens.

Acontece, meu caro... :) :cheers:


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

lol

Mas não digas nada, por vezes é dificil deixar de pensar em objectos e classes, e pensar "apenas" em writeln's e readln's...

Chega a uma ponto que nem sei se o que estou a usar é "simples" o suficiente! :)

E pra mais não sou nenhum expert. Estive muitos anos sem ver um IF à frente!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

Estive muitos anos sem ver um IF à frente!

Heim?? :o

Operacionaliza-me isso... :)


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Offtopic por offtopic...  :)

Programei de seguida entre 1992 e 2000. Em 2002 ainda lhe mexi durante uns 15 dias, e depois nunca mais programei, até ao fim de 2010, quando lhe voltei a pegar por necessidade profissional...

O resto é historia!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.