quarta-feira, 29 de julho de 2009

Problemas com separador de casas decimais

Tendo em vista que muitos programadores tem problemas com a conversão de dados de string para float e vice-versa, quando há necessidade de trabalhar com a configuração do windows no simbolo decimal com ponto ao invês de virgula, resolvi compartilhar uma função que uso em meus projetos para resolver esse problema.




Nesta função é vasculhado todos os componentes TEdit's do formulario ativo e caso o usuário tenha digitado uma virgula (,), o caracter é alterado para ponto automáticamente.

Segue a função:

procedure AlterVirgulaPonto(auxForm:TForm;var Key: Char);
var i : Integer;
begin
for i := 0 to auxForm.ComponentCount -1 do
begin
if auxForm.Components[i] is TEdit then
begin
with auxForm do
begin
if key in [',','.'] then
key := decimalseparator;
end;
end;
end;
end;

Após criado a função, basta chama-la no evento OnKeyPress do formulario.

Até a próxima...

sexta-feira, 24 de julho de 2009

Assinatura Digital EAD PAF-ECF

Ola pessoal!!!

Após algum tempo estou voltando a postar novas informações sobre um assunto muito discutido em alguns fóruns de programação. A assinatura digital EAD usada em aplicativos PAF-ECF para atender a nova legislação.

Neste post vou colocar a disposição o exemplo da função que estou usando em meu aplicativo para gerar essa assinatura EAD.

Observações:
Essa função que estou usando foi adquirida em um fórum disponibilizada por um membro e adaptada em meu aplicativo. Todo credito pelo desenvolvimento deve ser atribuído ao mesmo.

Essa assinatura é realizada apenas usando a DLL Libeay32.dll e a unit Libeay32.pas.




Vamos lá:

O primeiro passo é fazer o download da DLL e da Unit necessários para o funcionamento da função em questão.

Clique nos links a seguir para efetuar tal download:

http://www.disi.unige.it/person/FerranteM/delphiopenssl/libeay32.pas

http://www.dll-files.com/dllindex/dll-files.shtml?libeay32

Depois adcione a unit Libeay32.pas ao seu projeto.

Copie os códigos abaixo e faça as adaptações necessárias no seu projeto.

// função para gerar a assinatura EAD
function TECF.AssinaArquivo(fArquivo: String): Boolean;
var aAssinatura : String;
strList : TStringList;
begin
aAssinatura := Sign_RSA_MD5(ExtractFilePath(Application.ExeName)+'avisnet.pem',fArquivo);
// Assina Arquivo
strList := TStringList.Create;
strList.LoadFromFile(fArquivo);
strList.SaveToFile(fArquivo);
// strList.Add('EAD10'+copy(aAssinatura,1,254));
strList.Add('EAD'+aAssinatura);
strList.SaveToFile(fArquivo);
strList.Free;

end;



// função que retorna a assinatura digital EAD usando a DLL
function TECF.Sign_RSA_MD5(chave_privada, arquivo_assinar: string): string;
var Len: cardinal;
mdctx: EVP_MD_CTX;
inbuf, outbuf: array [0..1023] of char;
key: pEVP_PKEY;
a : pEVP_PKEY;
keyfile: pBIO;
oArquivo : TStringList;
begin
if FileExists(chave_privada) = false then
begin
raise Exception.Create('Arquivo da chave privada não foi encontrado.');
end;
if FileExists(arquivo_assinar) = false then
begin
raise Exception.Create('Arquivo para ser assinado não foi encontrado.');
end;
a := nil;
OpenSSL_add_all_algorithms; //
OpenSSL_add_all_ciphers; // InitOpenSSL
OpenSSL_add_all_digests; //
ERR_load_crypto_strings; //
try
keyfile := BIO_new(BIO_s_file());
BIO_read_filename(keyfile, PChar(chave_privada));
key := PEM_read_bio_PrivateKey(keyfile, a, nil, nil);
if key = nil then
begin
raise Exception.Create('Não foi possível ler a chave privada.');
end;
oArquivo := TStringList.Create;
oArquivo.LoadFromFile(arquivo_assinar);
// StrPCopy(inbuf,oArquivo.Text);
// oArquivo.Free;
EVP_SignInit(@mdctx, EVP_md5());
EVP_SignUpdate(@mdctx, pChar(oArquivo.Text), StrLen(pchar(oArquivo.Text)));
// EVP_SignUpdate(@mdctx, @inbuf, StrLen(inbuf));
EVP_SignFinal(@mdctx, @outbuf, Len, key);
BinToHex(outbuf, inbuf,Len);
inbuf[2*Len]:=#0;
oArquivo.Free;
Result := inbuf;
finally
EVP_cleanup; // FreeOpenSSL
end;

end;



Caso tenha efetuado corretamente os procedimentos esta pronto a rotina para assinar digitalmente um arquivo.

Basta agora compilar o projeto, selecionar um arquivo no formato TXT e enviar o comando para executar a rotina. Depois é só conferir a assinatura com o aplicativo eECFc.exe 3.0.12.0.

Qualque dúvida, post um comentário, terei prazer em tirar as dúvidas.