phelder 0 Denunciar post Postado Novembro 25, 2013 Ola, sou novo no delphi, preciso fazer o calculo de idade de uma pessoa, tenho no form um dbedit que recebe uma data de nascimento, ate ai blz, inseri mascara e tal, ate ai blz, no momento em que eu vou fazer o calculo aprece um erro 1///9/171, e foi digitado 01/09/1971. Obs: faco o calculo assim chamo uma funcao dbeditidade.text := inttostr(obteridade(dbeditnasc.text)); ak aparece o erro 9///171 gratoooo Compartilhar este post Link para o post Compartilhar em outros sites
Roberto Fagundes 40 Denunciar post Postado Novembro 25, 2013 Ao invés de mandar para o dbedit tente dar um ShowMessage(); Se o erro permanecer coloque o código desta função "obteridade()" para analisarmos Compartilhar este post Link para o post Compartilhar em outros sites
phelder 0 Denunciar post Postado Novembro 25, 2013 Ola, obrigado por responder, Roberto nem sai dai, mudei o dbedit para um maskedit com mascara, mudando a chamada da função onde era DBeditnasc por maskNasc e roda certinho, aparecendo a idade perfeito, mas com o dbedit da o erro descrito acima, se eu usar o maskedit como gravo essa idade no banco pode ser feito...já q com o dbedit ta dando erro grato Compartilhar este post Link para o post Compartilhar em outros sites
phelder 0 Denunciar post Postado Novembro 25, 2013 Ola, testando ak descobri que se for digitado no DBEditNasc uma data tipo 10/10/1971, passa ok e a idade e calculada, mas se digitar uma data 01/01/1971 da o erro /1///171, como se os zero não existissem...q faço grato Compartilhar este post Link para o post Compartilhar em outros sites
Roberto Fagundes 40 Denunciar post Postado Novembro 26, 2013 Então isso é o formato que sua função está jogando, para alterar o formato utilize: FormatDateTime('dd/mm/yyyy', StrToDateTime(<SuaDataEmString>)); Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Novembro 26, 2013 Me diga uma coisa, o que essa função obteridade faz? Não seria mais simples para calcular a idade usar as próprias funções do delphi? Considerando que você terá a data de nascimento e quer saber a idade da pessoa comparando a data atual, bastaria chamar esta função do dateutils: dbeditidade.text := IntToStr(YearsBetween(Now, GetData(Valor))); Compartilhar este post Link para o post Compartilhar em outros sites
phelder 0 Denunciar post Postado Novembro 26, 2013 Ola pessoal obrigado pela atenção, como sou novo no Delphi estou apanhando..veja tenho um dbedit que recebe uma data, bom ate ai, se esta data for digitada assim 01//01/1971 aparece /1///171 seria como se os zeros não contasse, coloquei outra data 10/01/1971 aparece 1/01//791, coloquei outra data 10/10/1971 passou certinho mostrou a idade como tinha que ser. o problema deve estar no dbedit, grato... Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Novembro 26, 2013 O problema pode estar na formatação do seu componente... aparentemente, quando digita datas com valores entre 1 e 9 para o dia/mês, a data perde a formatação e fica zoada... então, vamos por partes... a primeira questão é: o que faz a função obteridade, que você está usando? Poste o código dela por favor para analisarmos. Em segundo lugar, se o que quer é calcular o tempo em anos, a função que passei antes é uma boa pedida, só esqueci de colocar o código da função GetData, que uso para formatar uma data no formato "YYYY-MM-DD" para "DD/MM/YYYY". { Pega a data recebida como YYYY-MM-DD e transforma numa data válida para uso no Delphi } Function GetData(Valor:Variant):TDateTime; var vFormatSettings: TFormatSettings; begin vFormatSettings.ShortDateFormat := 'YYYY-MM-DD'; vFormatSettings.DateSeparator := '-'; Result := StrToDate(Valor, vFormatSettings); end; dbeditidade.text := IntToStr(YearsBetween(Now, GetData('2013-01-01')); No caso acima, eu precisei formatar uma string numa data válida para trabalhar, pois o arquivo que recebia trabalhava com datas num formato diferente das configurações regionais da máquina. Um problema que já tive com maskedits é que as vezes a máscara fica zoada conforme a forma que você a declara no componente... por isso que, para receber campos de data eu prefiro usar o DateTimePicker da Win32 (Delphi 7), que já te devolve um valor TDateTime quando o usa. Considerando que usasse o DateTimePicker para o usuário informar a data de nascimento, tudo o que precisaria pra capturar a idade seria: dbeditidade.text := IntToStr(YearsBetween(Now, DateTimerPicker1.Date)); Com a vantagem de ter um componente que já trás um calendário embutido pro usuário poder selecionar a data. Compartilhar este post Link para o post Compartilhar em outros sites
phelder 0 Denunciar post Postado Novembro 26, 2013 Ola Chrnos, obrigado pela atenção, fiz assim no DbEditNasc coloquei var datat: TDataTime; begin data:= StrToDate(DbEditNasc); DbEditIdade := IntToStr(YearBetween(Now, data)); end; então se digitar no DbEditNasc 10/10/1971 OK idade certinha, mas se digitar 01/01/1971 ou 10/01/1971 erro, vc esta certo fica zoado se tiver zero no dia ou mês ... q faço. Grato. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Novembro 26, 2013 Tente fazer o seguinte: var dAux: TDateTime; format : TFormatSettings; begin format.ShortDateFormat := 'dd/mm/yyyy'; format.DateSeparator := '/'; dAux:= StrToDate(DbEditNasc, format); DbEditIdade := IntToStr(YearBetween(Now, dAux)); end; Compartilhar este post Link para o post Compartilhar em outros sites
phelder 0 Denunciar post Postado Novembro 26, 2013 Ola, grato pela ajuda, dando uma olhada ak mudei no próprio Windows la estava d/m/aa mudei para dd/mm/aaaa e funcionou grato... Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Novembro 26, 2013 Ola, grato pela ajuda, dando uma olhada ak mudei no próprio Windows la estava d/m/aa mudei para dd/mm/aaaa e funcionou grato... Legal, as configurações regionais da máquina as vezes pregam estas peças na gente mesmo... por isso tinha te passado o código anterior, que mudaria a configuração regional temporariamente pra efetuar o cálculo (a variável format do tipo TFormatSettings seria usado pra isso). Só lembre-se que o mesmo problema poderá ocorrer no computador do cliente... no mais, sucesso e boa sorte! Compartilhar este post Link para o post Compartilhar em outros sites