Ir para conteúdo
  • Cadastre-se

dev botao

Como implementar o evento "OnGetSignAC" em tempo de execução?


  • Este tópico foi criado há 3025 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Bom dia pessoal, tenho um projeto que utilizao o ACBRSAT mas o componente nós criamos em tempo de execução.

Estou tendo dificuldades em passar a assinatura para o componente, pois o componente possui o evento OnGetSignAC

 

Em meu código criei meu proprio método:

procedure GetsignAC(var Chave: AnsiString);
begin
  Chave := FAssinatura;
end;

 

e depois tentei ligá-lo ao evento do componente:
ACBrSat1.OnGetsignAC := GetsignAC;

Me retorna o erro de imcompatibilidade, mas não sei como resolvê-lo:
[DCC Error] Integra_Sat.pas(1566): E2009 Incompatible types: 'method pointer and regular procedure'

 

Sem mais, agradeço antecipadamente a ajuda.

Abraços!

 

 

 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

ahh... agora que notei... sua procedure não faz parte de nenhuma classe...

Você precisa criá-la como parte de algum Objeto ou Classe.. Ex: um DataModule ou Form
 

procedure GetsignAC(var Chave: AnsiString);   // ERRADO

procedure DataModule1.GetsignAC(var Chave: AnsiString);  // CORRETO

 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

Encontrei alguma coisa no google, orientando para compatibilizar os eventos eu deveria criar uma classe, assim o fiz: 
type
     TUtil = class
   public
     procedure GetsignAC(var Chave: AnsiString);
 end;

var
Util : TUtil;

procedure Tutil.GetsignAC(var Chave: AnsiString);
begin
  Chave := FAssinatura;
end;

E tentei novamente ligar os eventos:
ACBrSat1.OnGetsignAC := Tutil.GetsignAC;

Novo erro:
[DCC Error] Integra_Sat.pas(1567): E2010 Incompatible types: 'TACBrSATGetChave' and 'Procedure'

 

Editado por Marcelo França_1209
Link para o comentário
Compartilhar em outros sites

ahh... agora que notei... sua procedure não faz parte de nenhuma classe...

Você precisa criá-la como parte de algum Objeto ou Classe.. Ex: um DataModule ou Form
 

procedure GetsignAC(var Chave: AnsiString);   // ERRADO

procedure DataModule1.GetsignAC(var Chave: AnsiString);  // CORRETO

 

Da forma que está criado meu projeto, eu não tenho nenhum FORM viável para realizar esta solução que vc propôs, teria outro jeito?

Você chegou a ver minha última resposta? Encontrei algo falando sobre criar os métodos dentro de uma classe e tal? de uma olhada na minha resposta anterior.

 

Abraços!

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Você está programando errado... procedural em um mundo O.O.

Use O.O.... crie uma ou várias classes para o seu projeto...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

Criei a classe para compatibilizaro o evento:
  type
     TUtil = class ( TACBrSATClass )
   public
     procedure GetsignAC(var Chave: AnsiString);
   end;

Fiz a ligação, e nada: 
ACBrSat1.OnGetsignAC := Tutil.GetsignAC;
[DCC Error] Integra_Sat.pas(1567): E2010 Incompatible types: 'TACBrSATGetChave' and 'Procedure'

Acredito que não esteja declarando a classe TUtil da forma correta (TacbrSATClass?)

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Tente assim:
 

type

SuaClasse = class( TComponent )
private
   procedure GetsignAC(var Chave: AnsiString);
   FACBrSAT: TACBrSAT;
public
   constructor Create;
   destructor Destroy;
   
   property ACBrSAT: TACBrSAT read FACBrSAT;
end;

implementation

constructor SuaClasse.Create;
begin
  inherited;
  FACBrSAT := TACBrSAT.Create(self);
  FACBrSAT.OnGetsignAC := GetsignAC;
end;

destructor SuaClasse.Destroy;
begin
  FACBrSAT.Free;
  inherited;
end;

procedure SuaClasse.GetsignAC(var Chave: AnsiString);
begin
  Chave := 'SUA_CHAVE'; 
end

 

(fiz no Bloco de Notas... pode haver erros de sintaxe... )

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

Daniel, muitíssimo obrigado pela paciência e ajuda, mas consegui resolver utilizando o código que eu tinha postado anteriormente:

Criando a classe localmente:
  type
     TUtil = class ( TACBrSATClass )
   public
     procedure GetsignAC(var Chave: AnsiString);
   end;
Var
Util : TUtil;


Implementanto a procedure:
procedure Tutil.GetsignAC(var Chave: AnsiString);
begin
  Chave := FAssinatura;
end;

E realizando a ligação do evento do componente, com a a minha procedure, e AQUI ESTAVA O ERRO:

Eu estava fazendo assim:
ACBrSat1.OnGetsignAC      := Tutil.GetsignAC;

Quando o correto é assim:
ACBrSat1.OnGetsignAC      := util.GetsignAC;


Obrigado mais uma vez, abraços!

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

se mudar para:

TUtil = class
    public
        class procedure GetsignAC(var Chave: AnsiString);
    end;

 

e tentar assim, pegando da classe mesmo:

ACBrSat1.OnGetsignAC      := Tutil.GetsignAC;

 

não daria certo? ai não precisaria criar o objeto.

Editado por russocorp
Erro na declaração da classe
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 6 meses depois ...
  • Este tópico foi criado há 3025 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.