Resolvendo problemas na impressão da DANFe – ACBr

Esta semana eu e um colega de trabalho passamos um sufoco com a impressão da DANFe com ACBr e Fast Report. Sempre que chamava o método de visualização do pdf, ocorria o erro:

cdsIdentificacao: Missing dataset provider

 

Na primeira ocasião, o problema estava no formulário que estava sendo criado automaticamente na inicialização do projeto. Até aí tudo bem, mas como a tela seria usada num outro módulo o erro voltou a ocorrer.

O que fazer? Simples, na unit ACBrNFeDANFEFRDM.pas, no componente frxReport carregue o arquivo danfe.fr3 e salve. Refaça um build do projeto e estará tudo ok.

Espero ter ajudado 😉

Anúncios

Resolvendo problema de “variant or safe array is locked” no Delphi

Boa noite!

Pode acontecer em alguns casos ao carregar um arquivo XML pelo Delphi o erro de variant or safe array is locked. O problema ocorre devido o arquivo MIDAS.DLL estar desatualizado.

Caso você atualize o arquivo e mesmo assim o problema persiste, na unit onde você faz uso do Client Data Set com xml basta adicionar a uses midaslib.

Fácil de resolver, porém me levou um certo tempo para descobrir. 😉

Abraços e até a próxima.

Criando threads com Delphi

Fala galera! Irei iniciar 2014 com um post sobre threads. Mas o que são threads?

Segundo a Wikipedia, threads são “uma forma de um processo dividir a si mesmo em duas ou mais tarefas que podem ser executadas concorrentemente”. Legal, mas no que uma thread pode me ajudar?

Usos

Threads geralmente são utilizadas para executar uma tarefa que possa demandar muito tempo, podemos utilizar como exemplo o backup de uma base de dados.

A vantagem de se utilizar uma thread é que ela executa enquanto você pode utilizar outras funções da sua aplicação, diferente das vias normais onde você teria de esperar o seu programa executar toda a ação.
Continuar lendo

Autenticação SSL no Delphi – acessando o GMail.

Certamente algum cliente já deva ter lhe solicitado para adicionar uma “opçãozinha” de enviar e-mail na sua aplicação.
Mas e quando eu preciso fazer isso através do Gmail ou outro servidor que requer autenticação SSL? Neste artigo veremos como!

Delphi e SSL

Quem utiliza a função de envio de e-mails (e até de recebimento) pela paleta de componentes Indy, dispõe do componente TIdSSLIOHandlerSocket que faz a autenticação SSL com o servidor.

Basta adicionar no formulário e vincular ao IdSMTP ou IdPOP3. O vínculo é feito através da propriedade IOHandler.

acesso_gmail_delphi

acesso_gmail_delphi_obj

 

Importante!

Dependendo da versão do Indy que você está usando, é necessário que seja distribuída junto com a aplicação as DLL’s libeay32.dll e ssleay32.dll (as DLL’s para o Delphi 7 podem ser baixadas aqui: http://indy.fulgan.com/SSL/Archive/indy_openssl096.zip).

Simples, não?
Abraço e até a próxima!

Verificar conexão de internet com Delphi

Esta simples função serve para verificar se o seu computador está conectado a Internet. Pode ser usada, por exemplo, num software de atualização para o seus sistemas!

function TfrmMenu.estaConectado: boolean;
var
 flags : DWORD;
begin
 // verifica se está conectado a internet usando a API do Windows, é preciso declarar a uses WinInet.
 if not InternetGetConnectedState(@flags, 0) then
    result := false
 else
    result := true;
end;

Executando programas externos com o Delphi

Esta é uma dica bem simples. Para executar um programa externo via delphi, existe a função WinExec. Sua sintaxe é a seguinte:

function WinExec(cmdLine: PAnsiChar, uCmdShow: cardinal): cardinal;

No primeiro parametro passamos o nome do executável e no segundo é passado um valor numerico (0,1 e 2) que irá definir em qual modo o programa será aberto (maximizado, minimizado ou normal).

No exemplo abaixo, vamos abrir a calculadora do Windows:

procedure TForm1.Button1Click(Sender: TObject);
begin
WinExec('calc.exe', 0)
end;

Simples não é?

See ya and happy hacking! 🙂

“Varrendo” componentes no Delphi.

As vezes, quanto temos vários componentes num mesmo formulário, fica cansativo efetuar operações com todos eles ao mesmo tempo, como também aumenta o número de linhas no nosso código fonte. Nesta dica trago uma maneira de como contornar este problema.

Digamos que temos a seguinte situação: Um formulário com 30 TEdits e você que limpar todos eles. Você pode usar o método clear ou definir a propriedade text como nula:

Edit1.text := '';
//ou
Edit1.Clear;

Até aí tudo bem, o problema é que seriam 30 linhas a mais no código. Não fará diferença ao compilador, porém, fica esteticamente ruim para a manutenção (isso porque são 30 linhas, imagine se tivessemos 100 edits).

Então, como proceder? Simples:

procedure TForm1.Button1Click(Sender: TObject);
var
   i : integer;
begin
   for i := 0 to Self.ComponentCount - 1 do
   begin
      if UpperCase(Self.Components[i].ClassName) = Uppercase('TEdit');
         TEdit(Self.Components[i]).Clear;
   end;
end;

Explicando o código:

  • Usamos o for para varrer todos os componentes do formulário;
  • No if, verificamos se a classe do componente é TEdit, ou seja, verificamos se o componente é um TEdit (ou outro componente, TButton, por exemplo.);
  • Caso a condição seja verdadeira, é feito um cast e executado o método clear.

Simples não é?

Dúvidas e sugestões, comentem!

Abraços e até a próxima.