Ajuda - Busca - Membros - Calendário
Versão Completa: (Resolvido) Erro de conversão em função
Fórum Script Brasil > Programação & Desenvolvimento > Delphi, Kylix
robinhocne
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:

QUOTE
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:

CODE
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.

CODE
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;
Micheus
QUOTE(robinhocne @ 29/03/2008 - 17:03) *
(...), mas na hora de executar pelo "F9" está dando esse erro:[/b]

QUOTE
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:

CODE
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:
CODE
for i := 1 to Length( nPro ) do
      begin
         if ENumero( Copy( nPro, i, 1 ) ) then
            nCPr := nCPr + Copy( nPro, i, 1 );
      end;
por:
CODE
for i := 1 to Length(nPro) do
    if nPro[i] in ['0'..'9'] then
      nCPr := nCPr +nPro[i];

e substitua:
CODE
for i := 1 to Length( pSHD ) do
      begin
         if ENumero( Copy( pSHD, i, 1 ) ) then
            nHDS := nHDS + Copy( pSHD, i, 1 );
      end;
por:
CODE
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:
CODE
function ENumero(StrNumber :string) :Boolean;
begin
  try
    StrToFloat(StrNumber);
    Result := True;
  except
    Result := False;
  end;
end;

Abraços
robinhocne
QUOTE(Micheus @ 29/03/2008 - 19:02) *
QUOTE(robinhocne @ 29/03/2008 - 17:03) *
(...), mas na hora de executar pelo "F9" está dando esse erro:[/b]

QUOTE
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:

CODE
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:
CODE
for i := 1 to Length( nPro ) do
      begin
         if ENumero( Copy( nPro, i, 1 ) ) then
            nCPr := nCPr + Copy( nPro, i, 1 );
      end;
por:
CODE
for i := 1 to Length(nPro) do
    if nPro[i] in ['0'..'9'] then
      nCPr := nCPr +nPro[i];

e substitua:
CODE
for i := 1 to Length( pSHD ) do
      begin
         if ENumero( Copy( pSHD, i, 1 ) ) then
            nHDS := nHDS + Copy( pSHD, i, 1 );
      end;
por:
CODE
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:
CODE
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.
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2012 Invision Power Services, Inc.