Desabilitar Temporariamente a execução de um Evento

Delphi

22/03/2005

Bom Dia Senhores.

Tenho Um a procedure na secção Private do meu Formulário. Esta procedure e ativada pelas Mensagems Enviadas da Api Do Windows

procedure WMTimeChange(var Message: TMessage); message WM_TIMECHANGE;


Sabemos que para desabilitar Um evento , Muitas das Vezes Atribuimos [b:892eea5453]Nil [/b:892eea5453]ao seu manipulador

Exemplo :

Form1.Edit1Change:=Nil


E Como Fazer Para Desabilitar estas Chamadas Que Vem , Digamos assim, da Api Do Windows :?: :?: :?: :?: :?: :?: :?:

Obrigado


Marco Salles

Marco Salles

Curtidas 0

Respostas

Nildo

Nildo

22/03/2005

Coloca um IF dentro da WMTimeChange

if WmTimeChange_Habilitado then
   // Faz tudo aqui


Dai é só você alterar o valor de [b:db5b9ea197]WmTimeChange_Habilitado[/b:db5b9ea197] que será global.


GOSTEI 0
Marco Salles

Marco Salles

22/03/2005

Beleza Nildo.. De fato , ja tinha pensado nisso... Mas será que é sua palavra final no assunto.. Isto é : Não tem código , via delphi , que desabilite a Chamada a Esta Procedure :lol: :lol: :lol: :lol: :lol:

E que estou trabalhando com[b:9e0268e024] tempo[/b:9e0268e024], e eu gostaria se possível , diga-se de passagem, que a Chamada a Procedure Nen Ocorresse em Determinadas Condições :lol: :lol: :lol: :lol:

Mas de qualquer forma é muita válida a sua participação :P :P :P :P :P


GOSTEI 0
Nildo

Nildo

22/03/2005

Deve até ter como fazer, mas eu não me lembro :oops:


GOSTEI 0
Marco Salles

Marco Salles

22/03/2005

Mas se voce se lembrar estamos ai :D :D :D :D :D :D


GOSTEI 0
Kapak

Kapak

22/03/2005

Deve até ter como fazer, mas eu não me lembro
Acredito que nem por funções hook vc desabilita WM_TimeChange.
Quando chega essa msg, é pq a data/hora já foi alterada; ou seja; já era.


GOSTEI 0
Nildo

Nildo

22/03/2005

[quote:e8f2aafc8e]Deve até ter como fazer, mas eu não me lembro
Acredito que nem por funções hook vc desabilita WM_TimeChange.
Quando chega essa msg, é pq a data/hora já foi alterada; ou seja; já era.[/quote:e8f2aafc8e]

Ele nao quer desabilitar Wm_TimeChange, ele quer apenas ´deshookar´ esse controle do processo dele para nao receber mais notificações


GOSTEI 0
Kapak

Kapak

22/03/2005

Olá Nildo, pelo outro tópico que estávamos debatendo, o problema dele é de não deixar o usuário alterar a hora; então acredito que ele deve estar pensando que se for bloqueada essa msg, a hora não será alterada. Posso estar enganado, mas se for isso não vai adiantar pq vc pode instalar uma hook do tipo wh_callwndproc e não deixar que o Windows passe essa msg p/ os destinatários, mas o problema é que quando chega essa msg, a data/hora já foi modificada.


GOSTEI 0
Nildo

Nildo

22/03/2005

Kapak, ele só quer receber a notificação em determinado momento. Passado esse momento, ele não quer mais receber as notificações para não tomar muito processamento. Mas as mensagens vão continuar sendo processadas para os outros processos normalmente


GOSTEI 0
Kapak

Kapak

22/03/2005

Então eu não entendí, pq essa notificação não toma muito processamento pq ela só chega quando a data/hora é alterada por intervenção externa. O relógio interno não envia essa msg.


GOSTEI 0
Nildo

Nildo

22/03/2005

Então eu não entendí, pq essa notificação não toma muito processamento pq ela só chega quando a data/hora é alterada por intervenção externa. O relógio interno não envia essa msg.


Por isso eu instruí a usar uma variável de controle :P


GOSTEI 0
Kapak

Kapak

22/03/2005

Ah sim, acho que ele executa SetLocalTime dentro da procedure da msg e com isto wm_timechange é gerado e ficaria num loop infinito.


GOSTEI 0
Nildo

Nildo

22/03/2005

Provavelmente


GOSTEI 0
Marco Salles

Marco Salles

22/03/2005

Ah sim, acho que ele executa SetLocalTime dentro da procedure da msg e com isto wm_timechange é gerado e ficaria num loop infinito.


Provavelmente


é mais ou menos por aí...

Preciso desabilitar esta Chamada :oops: :oops: :oops: :oops: :oops:


GOSTEI 0
Nildo

Nildo

22/03/2005

Usa uma variável de controle, é mais facil hehe


GOSTEI 0
Marco Salles

Marco Salles

22/03/2005

Usa uma variável de controle, é mais facil hehe


Ja que não tem Jeito e ningume se arrisca :cry: :cry: :cry: Fazer o que ne :?: :?: :?:


GOSTEI 0
Marco Salles

Marco Salles

22/03/2005

Mas a Esperança é a última que morre :lol: :lol: :lol: :lol:


GOSTEI 0
Beppe

Beppe

22/03/2005

[quote:35cfe5235f=´Marco Salles´]
Usa uma variável de controle, é mais facil hehe


Ja que não tem Jeito e ningume se arrisca :cry: :cry: :cry: Fazer o que ne :?: :?: :?:[/quote:35cfe5235f]
Plano e simples? Não...

Métodos marcados com [b:35cfe5235f]message[/b:35cfe5235f] são marcados são implementados como dynamic. Cada método destes possui um índice de 16 bits que endereça em uma tabela que contém os métodos propriamente ditos. Esta classe é compartilhada por todas instâncias da classe. Em princípio, é possível replicar o template da classe e modificá-la para uma instânmcia apenas, mas isto poderia ter algumas complicações quanto a otimizações feitas pelo compilador. Uma modificação in-place habilitaria/desabilitaria de forma global, e teria que ser mexida em uma área somente-leitura. O Win2000 e o XP se preocupam com isso, o 98 não tenho certeza. Para tornar a área leitura-escrita, basta chamar VirtualProtect da API do Windows, mas não estou certo se em alguma configuração da máquina isto poderia ser barrado. Numa instalação dométisca daria certo sim.

Desabilitar na verdade é impossível, você substituiria por uma chamada a um método [i:35cfe5235f]dummy[/i:35cfe5235f]. Mas seria mais trabalho do que usar a alternativa proposta pelo nildo.


GOSTEI 0
POSTAR