ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Hackeando um evento do Delphi

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
rafael_acacio
Novato
Novato


Registrado: Segunda-Feira, 25 de Novembro de 2013
Mensagens: 15

MensagemEnviada: Ter Dez 03, 2013 12:48 pm    Assunto: Hackeando um evento do Delphi Responder com Citação

Saudações galera.

Estou com um problema que está tirando o meu sono. E para resolvê-lo em pensei em criar um componente que quando adicionado um Data Modulo (DM) automaticamente iria monitorar alguns eventos dos componentes do Interbase (IBDATBASE, IBQUERY, ETC).
Eu achei algo parecido com isso na internet mas nada que funcionasse.
Alguém tem uma luz para me ajudar ???

O que eu tentei até o momento foi criar um Unit e dentro dela criar um classe do tipo do componente que eu quero Exemplo: TDataSet
E dentro dessa classe fazer um override da função AfterOpen.
Mas não funcionou.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Thales_fr
Aprendiz
Aprendiz


Registrado: Sábado, 28 de Agosto de 2004
Mensagens: 204

MensagemEnviada: Ter Dez 03, 2013 3:43 pm    Assunto: Responder com Citação

O que você precisa fazer exatamente?
Se for sobrescrever métodos de um componente, você terá que criar um componente seu baseado no original. Analise a classe original para saber como sobrescrever um método, no caso dos dataset, tem métodos protected como o DoAfterOpen que é o método chamado após abrir o dataset e não o evento propriamente dito.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Yahoo Messenger MSN Messenger
rafael_acacio
Novato
Novato


Registrado: Segunda-Feira, 25 de Novembro de 2013
Mensagens: 15

MensagemEnviada: Ter Dez 03, 2013 4:20 pm    Assunto: Responder com Citação

Então Thales_fr,

Na verdade eu quero monitorar os eventos da classe tdataset.
Eu vi que nesta classe há procedures como "CheckActive", "DataEvent" e "DoBeforeOpen". Queria saber se há como eu criar um componente e atribuir meu evento a chamada desses eventos.
Dessa forma qualquer componente que eu coloque no Data Modulo que utilize um Dataset estará sendo monitorado. Essa é minha ideia. Queria fazer de forma dinâmica.

O que é quero é colocar o componente na DM e automaticamente ele ter os mesmos eventos de navegação, exclusão, atualização de um TDataset do ibquery que esteja sendo executado.

Nem sei se é possível fazer tal procedimento mas vamos ver né...

Valeu aí amigo.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Thales_fr
Aprendiz
Aprendiz


Registrado: Sábado, 28 de Agosto de 2004
Mensagens: 204

MensagemEnviada: Ter Dez 03, 2013 4:25 pm    Assunto: Responder com Citação

A única maneira que eu conheço de fazer isso seria você pegar e escrever uma unit com a class do TDataSet e sobreescrever todos os métodos que você desejar e em todos os lugares que você utilizar um dataset, você teria que colocar essa unit na lista sendo sempre uma das últimas na lista.

tipo assim:

Código:
unit untMeuDataSet;

inteface

uses
  DB,
  //adicione as units que forem necessárias

type
  TDataSet = class(DB.TDataSet)
  protected
    //sobrecarregue os métodos
  end;

//...continua


e nos lugares que for usar:

Código:

...

uses
  DB,
  IBDataSet,
  untMyDataSet;


espero que te ajude.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Yahoo Messenger MSN Messenger
rafael_acacio
Novato
Novato


Registrado: Segunda-Feira, 25 de Novembro de 2013
Mensagens: 15

MensagemEnviada: Ter Dez 03, 2013 4:36 pm    Assunto: Responder com Citação

Então...

Eu já havia feito um teste assim antes. E não tinha funcionado. Mas eu fiz novamente com o que vc mandou.

Código:
unit Unit2;

interface

uses
  DB;
  //adicione as units que forem necessárias

type
  TDataSet = class(DB.TDataSet)
  protected
    procedure DoBeforeOpen; override;
  end;

implementation

procedure TDataSet.DoBeforeOpen;
begin
  inherited;
end;

end.


E coloquei ele por último em todos os USES.

Não funcionou.
O mais certo é que eu estou fazendo errado. O problema é saber onde estou errando.

Tem como vc montar um exemplo Thales_fr para eu ver funcionando ?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Thales_fr
Aprendiz
Aprendiz


Registrado: Sábado, 28 de Agosto de 2004
Mensagens: 204

MensagemEnviada: Ter Dez 03, 2013 9:30 pm    Assunto: Responder com Citação

Qual o delphi que você está utilizando?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Yahoo Messenger MSN Messenger
rafael_acacio
Novato
Novato


Registrado: Segunda-Feira, 25 de Novembro de 2013
Mensagens: 15

MensagemEnviada: Ter Dez 03, 2013 9:39 pm    Assunto: Responder com Citação

Delphi XE3 ou XE2 ou Delphi 7
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Thales_fr
Aprendiz
Aprendiz


Registrado: Sábado, 28 de Agosto de 2004
Mensagens: 204

MensagemEnviada: Ter Dez 03, 2013 9:53 pm    Assunto: Responder com Citação

A partir do delphi xe vc pode usar class helper da uma olhada no link a seguir para entender:

http://www.devmedia.com.br/class-helpers/454
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Yahoo Messenger MSN Messenger
rafael_acacio
Novato
Novato


Registrado: Segunda-Feira, 25 de Novembro de 2013
Mensagens: 15

MensagemEnviada: Qua Dez 04, 2013 7:49 am    Assunto: Responder com Citação

Bom dia.

Cara muito obrigado. Você acabou de resolver um outro problema que estava engavetado aguardando um solução milagrosa. Algo que parecia ser tão complicado acabou sendo ridicularizado.
Bom vamos falar do atual problema. Pelo que eu entendi a Classe Helpers vai estender as funcionalidades da classe pretendida para que eu possa customiza-la sem precisar informar todo o restante como eu fazia antes.
Mas isso não resolve o problema do TDataset. Minha pretensão e assumir controle dos eventos dessa classe. Quando você está manipulando banco de dados esses eventos, abrir, fechar, inserir, atualizar e navegar ocorrem de forma transparente ao usuário. O que eu quero é assumir controle desses eventos e passar a monitorá-los.
Quero fazer um LOG de tudo que acontece entendeu ?
" - Mas então é só criar um controle e atribuir os objeto que você quer controle em uma proriedade!". Sim mas isso seria imensamente trabalhoso já que eu quero implantar isso em vários projetos que já estão em produção e não possuem LOG e um sistema de monitoramento para uma possível auditoria.
Como eu estou achando que isso vai ser quase impossivel de fazer eu poderia ao menos atribuir o componente Database ao meu componente. Mas eu não sei como herdar um array de datasources já que ele o Database pode ter (E vai ter) mais de um.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Thales_fr
Aprendiz
Aprendiz


Registrado: Sábado, 28 de Agosto de 2004
Mensagens: 204

MensagemEnviada: Qua Dez 04, 2013 8:01 am    Assunto: Responder com Citação

Acredito que você teria que criar class helpers para cada classe que existir de dataset como TIBDataSet, TIBQuery entre outras, pois o class helper funciona específico para a classe ativa, pelo que eu sei.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Yahoo Messenger MSN Messenger
rafael_acacio
Novato
Novato


Registrado: Segunda-Feira, 25 de Novembro de 2013
Mensagens: 15

MensagemEnviada: Qua Dez 04, 2013 8:05 am    Assunto: Responder com Citação

Mas o Classe Helpers seria no caso apenas para implentação ou eu conseguiria fazer um override de suas procedures(Eventos) ?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qua Dez 04, 2013 9:27 am    Assunto: Responder com Citação

Amigo acredito que vc não tenha que fazer isto, veja esta função que utilizo para verificar certas condições do dataset:



Código:
// ************************************* RETORNA O STATUS DO DATASET ****************************
function ReturnDataSetStatus(DataSet: TDataSet; Comp: TJvNavPanelHeader): TDataSetState;
const
     Estados : array [TDataSetState] of string = ('F','C','A','I','','','','','','','','','');
     //('Fechado','Consultando','Alterando','Inserindo','','','','','','','','','');
begin
     if DataSet = nil then
     begin
          Application.MessageBox('Erro ao Inicializar a Função: "ReturnDataSetStatus()"', 'AVISO DO SISTEMA', mb_ok+mb_iconwarning);
          Exit;
     end;
     
     case DataSet.State of
      dsInactive: begin
                       Comp.Caption   := Estados[DataSet.State];
                       Comp.ColorFrom := clRed;
                  end;
      dsBrowse: begin
                       Comp.Caption  := Estados[DataSet.State];
                       Comp.ColorFrom := $00FFCF9F;
                  end;
      dsEdit: begin
                       Comp.Caption   := Estados[DataSet.State];
                       Comp.ColorFrom := $0079D3FB;
                  end;
      dsInsert: begin
                       Comp.Caption   := Estados[DataSet.State];
                       Comp.ColorFrom := clLime;
                  end;
     end;
     Result := DataSet.State;
end;



Lembrando que TDataSetState é da unit DB, veja como é implementado e vc consegue fazer o que vc deseja sem ter de reimplementar o componente.



bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
RodrigoFarias
Experiente
Experiente


Registrado: Domingo, 27 de Julho de 2008
Mensagens: 443

MensagemEnviada: Qua Dez 04, 2013 11:39 am    Assunto: Responder com Citação

Rafael,
Faça da maneira certa, crie um componente descendente do TDataSet (ou do componente que você quer) e utilize POO para resolver sua necessidade.

Att.
_________________

Novo Find Uses Para Delphi - https://github.com/rfrezino/RFindUnit
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Thales_fr
Aprendiz
Aprendiz


Registrado: Sábado, 28 de Agosto de 2004
Mensagens: 204

MensagemEnviada: Qua Dez 04, 2013 11:46 am    Assunto: Responder com Citação

Concordo com o RodrigoFarias pois foi essa a minha primeira resposta, senão você tem mesmo que fazer o Class Helper, só para orientar um pouco, você tem que criar uma classe que faça a tarefa que você precisa e os class helpers de cada classe irá utiliza-la.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Yahoo Messenger MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB