Jump to content
Fórum Script Brasil
  • 0

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


Question

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;

Edited by Micheus
Post desmembrado de outro tópico.
Link to post
Share on other sites

2 answers to this question

Recommended Posts

  • 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 to post
Share on other 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 to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      148691
    • Total Posts
      644530
×
×
  • Create New...