Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Erro de conversão em função


robinhocne

Pergunta

Tópico de origem: Erro "multiple rows in singleton"

__________________

Bom, estou ficando meio ausente do forum por falta de tempo por causa da faculdade, mas ainda estou com alguns problemas e um é sobre esse tópico ainda, tinha conversado com Micheus e ele me pediu para fazer um debug, mas na hora de executar pelo "F9" está dando esse erro:

Project sistemacfc.exe raised exception class EConvertError with message "-' is not a valid floating point value'. Process stopped.

Use Step or Run to continue.

E aparece nessa linha de codigo em azul depois que aperto ok:

if ENumero( Copy( nPro, i, 1 ) ) then
Sei que isso não tem nada haver com esse tópico e erro que estava dando, mas o Micheus pediu para que eu postasse aqui, pois isso é para o programa fazer a verificação do serial do programa, embaixo tem todo o codigo da funcão. Aguardo resposta.
function VerificaSerial( pSHD, pSEs : String ) : Boolean;
var nPro, nCPr, nHDS, nPa1, nPa2, nSer : String;
    i : Integer;
    nRes : Extended;
    vReg : TRegistry;
    vAut : Boolean;
begin
   vAut         := True;
   vReg         := TRegistry.Create;
   vReg.RootKey := HKEY_LOCAL_MACHINE;
   // le a chave ProductID
   vReg.OpenKey( 'SOFTWARE\Microsoft\Windows\CurrentVersion', False );
   nPro  := vReg.ReadString( 'ProductID' );
   // remove todos os caracteres não numericos da chave do produto
   nCPr  := '';
   for i := 1 to Length( nPro ) do
      begin
         if ENumero( Copy( nPro, i, 1 ) ) then
            nCPr := nCPr + Copy( nPro, i, 1 );
      end;
   // remove todos os caracteres não numericos do serial do HD
   nHDS  := '';
   for i := 1 to Length( pSHD ) do
      begin
         if ENumero( Copy( pSHD, i, 1 ) ) then
            nHDS := nHDS + Copy( pSHD, i, 1 );
      end;
   // calcula o serial do programa
   nRes := ( StrToFloat( nCPr ) * StrToFloat( nCPr ) ) + StrToFloat( nHDS );
   nRes := nRes / ( StrToFloat( nHDS ) * 2 );
   i    := Pos( ',', FloatToStr( nRes ) );
   // verifica se foi encontrada alguma virgula no numero definido
   if ( i > 0 ) then
      begin
         nPa1 := Copy( FloatToStr( nRes ), 01, ( i - 1 ) );
         nPa2 := Copy( FloatToStr( nRes ), ( i + 1 ), ( Length( FloatToStr( nRes ) ) - i  ) );
      end;
   if Length( nPa1 ) > Length( nPa2 ) then
      nSer := nPa1
   else
      nSer := nPa2;
   // compara o serial encontrado, com o que esta gravado no registro da estacao
   if ( pSEs <> nSer ) then
      begin
//         Mensagem( 'Cópia ilegal!' );
         vAut := False;
      end;
   VerificaSerial := vAut;
end;

Editado por Micheus
Post desmembrado de outro tópico.
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0
(...), mas na hora de executar pelo "F9" está dando esse erro:

Project sistemacfc.exe raised exception class EConvertError with message "-' is not a valid floating point value'. Process stopped.

Use Step or Run to continue.

E aparece nessa linha de codigo em azul depois que aperto ok:

if ENumero( Copy( nPro, i, 1 ) ) then
roginhocne, acho que o erro já diz tudo: a sua função ENumero deve estar fazendo a tentativa de conversão do texto passado (via Copy(nPro, i, 1)) e este texto tem um caracter "-". Aparentemente esta sua função ENumero não está tratando as exceções e por isso gerando erro, mas precisaríamos dela para saber o que sugerir. Entretanto, você não precisa fazer uso desta função para tentar converte para numérico um caracter de cada vez. Use algo mais direto e eficiente - simplesmente teste se o caracter em questão é ou não um caracter numérico: '0', '1',... Assim, sugiro que você troque:
for i := 1 to Length( nPro ) do
      begin
         if ENumero( Copy( nPro, i, 1 ) ) then
            nCPr := nCPr + Copy( nPro, i, 1 );
      end;
por:
for i := 1 to Length(nPro) do
    if nPro[i] in ['0'..'9'] then
      nCPr := nCPr +nPro[i];
e substitua:
for i := 1 to Length( pSHD ) do
      begin
         if ENumero( Copy( pSHD, i, 1 ) ) then
            nHDS := nHDS + Copy( pSHD, i, 1 );
      end;
por:
for i := 1 to Length(pSHD) do
    if pSHD[i] in ['0'..'9'] then
      nHDS := nHDS +pSHD[i];
Mas, a título de você ter uma função ENumero que funcione, segue uma sugestão para esta função:
function ENumero(StrNumber :string) :Boolean;
begin
  try
    StrToFloat(StrNumber);
    Result := True;
  except
    Result := False;
  end;
end;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
(...), mas na hora de executar pelo "F9" está dando esse erro:

Project sistemacfc.exe raised exception class EConvertError with message "-' is not a valid floating point value'. Process stopped.

Use Step or Run to continue.

E aparece nessa linha de codigo em azul depois que aperto ok:

if ENumero( Copy( nPro, i, 1 ) ) then
roginhocne, acho que o erro já diz tudo: a sua função ENumero deve estar fazendo a tentativa de conversão do texto passado (via Copy(nPro, i, 1)) e este texto tem um caracter "-". Aparentemente esta sua função ENumero não está tratando as exceções e por isso gerando erro, mas precisaríamos dela para saber o que sugerir. Entretanto, você não precisa fazer uso desta função para tentar converte para numérico um caracter de cada vez. Use algo mais direto e eficiente - simplesmente teste se o caracter em questão é ou não um caracter numérico: '0', '1',... Assim, sugiro que você troque:
for i := 1 to Length( nPro ) do
      begin
         if ENumero( Copy( nPro, i, 1 ) ) then
            nCPr := nCPr + Copy( nPro, i, 1 );
      end;
por:
for i := 1 to Length(nPro) do
    if nPro[i] in ['0'..'9'] then
      nCPr := nCPr +nPro[i];
e substitua:
for i := 1 to Length( pSHD ) do
      begin
         if ENumero( Copy( pSHD, i, 1 ) ) then
            nHDS := nHDS + Copy( pSHD, i, 1 );
      end;
por:
for i := 1 to Length(pSHD) do
    if pSHD[i] in ['0'..'9'] then
      nHDS := nHDS +pSHD[i];
Mas, a título de você ter uma função ENumero que funcione, segue uma sugestão para esta função:
function ENumero(StrNumber :string) :Boolean;
begin
  try
    StrToFloat(StrNumber);
    Result := True;
  except
    Result := False;
  end;
end;

Abraços

Ok, mudei da meneira que você me passou e deu certo, então este tópico pode colocar como resolvido, obrigado mais uma vez.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...