Como mostrar a Idade da pessoa em Anos, Meses, Semanas e Dias ? A partir da data de nascimento até o dia atual (Print de exemplo: https://prnt.sc/ame)

Delphi

POO

VCL

Lógica de programação

Programação

21/07/2022


Boa tarde.

Estou utilizando o Delphi 11 e quero que apareça a Idade da pessoa igual eu descrevi no título, ele vai pegar o nascimento a partir de um Text do TEdit. Por enquanto só consegui pegar os anos, quando tempo pegar os meses, ele me retorna um valor super alto, e não sei como prosseguir com o resto.
procedure TfrmIMC.edtNascimentoExit(Sender: TObject);
  var
    lAnos, lMeses, lSemanas, lDias : Double;

begin
  lAnos := 0;
  lMeses := 0;
  lSemanas := 0;
  lDias := 0;



   if length(edtNascimento.Text) >= 8 then
  begin
    edtNascimento.Text := StringReplace(edtNascimento.Text,'/','',[rfReplaceAll]);
    edtNascimento.Text := copy(edtNascimento.Text,1,2)+'/'+copy(edtNascimento.Text,3,2)+'/'+copy(edtNascimento.Text,5,4);


    lAnos := YearsBetween(Date,StrToDate(edtNascimento.Text));
    lMeses := MonthOfTheYear(StrToDate(edtNascimento.Text));
    lMeses := MonthsBetween(Date,lMeses);



    lblIdade.Caption := CurrToStr(lAnos) +' anos; ' +CurrToStr(lMeses) +' meses; ' +CurrToStr(lSemanas) + ' semanas; ' +CurrToStr(lDias) +' dias; ';
  end;

end;


Renato Akira

Renato Akira

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

21/07/2022

tente assim:
var
  dDataIni, dDataFim: TDate;
  Ano1, Mes1, Dia1: word;
  Ano2, Mes2, Dia2: word;
  Anos, Meses, Dias: integer;
begin
  dDataFim := System.SysUtils.Date; // data atual, obtida do sistema
  dDataIni := DateTimePickerInicial.Date; // no lugar de TEdit usei DateTimePicker

  // separa a data inicial e final em dia, mes e ano
  System.SysUtils.DecodeDate(dDataIni, Ano1, Mes1, Dia1);
  System.SysUtils.DecodeDate(dDataFim, Ano2, Mes2, Dia2);

  // faz os cálculos para obter a idade em dias, meses e anos
  Anos := Ano2 - Ano1;
  Meses := Mes2 - Mes1;
  Dias := Dia2 - Dia1;
  if (Dias < 0) then
  begin
    Dec(Meses);
    Dias := 30 + Dias;
  end;
  if (Meses < 0) then
  begin
    Dec(Anos);
    Meses := 12 + Meses;
  end;

  // apresenta a mensagem na tela
  Vcl.Dialogs.ShowMessage(Format('%d anos, %d Meses e %d Dias', [Anos, Meses, Dias]));
end;


GOSTEI 0
Renato Akira

Renato Akira

21/07/2022


Obrigado Emerson, deu certo. Mas poderia me explicar a lógica por trás dos "IFs" ? E o por quê da decrementação?
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

21/07/2022

imagine que a data de nascimento é 26/09/1998 e hoje é dia 25/07/2022.
se apenas subtrair o ano (atual - nascimento): 2022 - 1998 daria o resultado 24; 24 anos (errado, porque o mês de nascimento é setembro e ainda 'estamos' em julho).
pra encontrar a quantidade de meses, fazemos a mesma subtração (atual - nascimento), que seria 7 - 9. resultado -2.
no caso o resultado é negativo (< 0), indicando que ainda não chegamos no mês de nascimento, então precisa ser subtraído 1 da idade, passando a 23 anos; também é preciso acrescentar 12 aos meses encontrados para encontrar o número de meses correto (-2 + 12 = 10).

é a mesma lógica para todos os itens: anos, meses e dias.
GOSTEI 0
POSTAR