| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
rafael_acacio Novato


Registrado: Segunda-Feira, 25 de Novembro de 2013 Mensagens: 15
|
Enviada: Ter Dez 03, 2013 12:48 pm Assunto: Hackeando um evento do Delphi |
|
|
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 |
|
 |
Thales_fr Aprendiz


Registrado: Sábado, 28 de Agosto de 2004 Mensagens: 204
|
Enviada: Ter Dez 03, 2013 3:43 pm Assunto: |
|
|
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 |
|
 |
rafael_acacio Novato


Registrado: Segunda-Feira, 25 de Novembro de 2013 Mensagens: 15
|
Enviada: Ter Dez 03, 2013 4:20 pm Assunto: |
|
|
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 |
|
 |
Thales_fr Aprendiz


Registrado: Sábado, 28 de Agosto de 2004 Mensagens: 204
|
Enviada: Ter Dez 03, 2013 4:25 pm Assunto: |
|
|
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 |
|
 |
rafael_acacio Novato


Registrado: Segunda-Feira, 25 de Novembro de 2013 Mensagens: 15
|
Enviada: Ter Dez 03, 2013 4:36 pm Assunto: |
|
|
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 |
|
 |
Thales_fr Aprendiz


Registrado: Sábado, 28 de Agosto de 2004 Mensagens: 204
|
Enviada: Ter Dez 03, 2013 9:30 pm Assunto: |
|
|
| Qual o delphi que você está utilizando? |
|
| Voltar ao Topo |
|
 |
rafael_acacio Novato


Registrado: Segunda-Feira, 25 de Novembro de 2013 Mensagens: 15
|
Enviada: Ter Dez 03, 2013 9:39 pm Assunto: |
|
|
| Delphi XE3 ou XE2 ou Delphi 7 |
|
| Voltar ao Topo |
|
 |
Thales_fr Aprendiz


Registrado: Sábado, 28 de Agosto de 2004 Mensagens: 204
|
|
| Voltar ao Topo |
|
 |
rafael_acacio Novato


Registrado: Segunda-Feira, 25 de Novembro de 2013 Mensagens: 15
|
Enviada: Qua Dez 04, 2013 7:49 am Assunto: |
|
|
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 |
|
 |
Thales_fr Aprendiz


Registrado: Sábado, 28 de Agosto de 2004 Mensagens: 204
|
Enviada: Qua Dez 04, 2013 8:01 am Assunto: |
|
|
| 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 |
|
 |
rafael_acacio Novato


Registrado: Segunda-Feira, 25 de Novembro de 2013 Mensagens: 15
|
Enviada: Qua Dez 04, 2013 8:05 am Assunto: |
|
|
| Mas o Classe Helpers seria no caso apenas para implentação ou eu conseguiria fazer um override de suas procedures(Eventos) ? |
|
| Voltar ao Topo |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Qua Dez 04, 2013 9:27 am Assunto: |
|
|
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 |
|
 |
RodrigoFarias Experiente


Registrado: Domingo, 27 de Julho de 2008 Mensagens: 443
|
Enviada: Qua Dez 04, 2013 11:39 am Assunto: |
|
|
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 |
|
 |
Thales_fr Aprendiz


Registrado: Sábado, 28 de Agosto de 2004 Mensagens: 204
|
Enviada: Qua Dez 04, 2013 11:46 am Assunto: |
|
|
| 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 |
|
 |
|