Desabilitar vários OnChances TDBEdits

Delphi

14/07/2010

Boa tarde Galera

Eu tenho um form onde possuo 10 TDBEdits e eles estão nomeados da seguinte forma:

edtGrau1, edtGrau2, edtGrau3, ..., edtGrau10;

Todos os TDBEdits possuem uma determinada rotina nos respectivos eventos OnChance.
Em um determinado momento eu presito desativar o evento OnChance de todos meus TDBEdits. Eu sei que é muito simples, basta fazer a seguinte implementação:

edtGrau1.OnChange := nil;
edtGrau2.OnChange := nil;
....
edtGrau10.OnChange := nil;

try

    // rotinas

finally
    edtGrau1.OnChange := edtGrau1Change;
    edtGrau2.OnChange := edtGrau2Change;
    ....
    edtGrau10.OnChange := edtGrau10Change;
and;


Porém eu queria deixar meu código mais limpo e automatizado, então tentei a seguinte implementação:

  //Desabilita OnChance de Todos TDBEdtis    
  for i := 1 to 10 do
  begin
    TDBEdit('edtGrau' + IntToStr(i)).OnChange := nil;
  end;

try

    // rotinas

finally
    //Habilita OnChance de Todos TDBEdtis
    for i := 1 to 10 do
    begin
      TDBEdit('edtGrau' + IntToStr(i)).OnChange := TNotifyEvent('edtGrau' + IntToStr(i) + 'Change');
    end;
and;


Quando vou compilar o projeto, acusa a seguinte msg de erro : [b] 'Incompatible types: 'TNotifyEvent' and 'string'[/b]

Alguem tem alguma sugestão para executar esse Typecast ou desabilitar/habilitar todos os Onchances de uma só vez??

Obrigado!
Rafael Pimenta

Rafael Pimenta

Curtidas 0

Respostas

Rafael Pimenta

Rafael Pimenta

14/07/2010

Desculpa a formatação do post anterior! Devo ter mudado o tamanho e a cor sem perceber! =/
GOSTEI 0
Alan Souza

Alan Souza

14/07/2010

vc pode "correr" todos os componentes do seu formulário pra desabilitar o OnChange:

for i := 0 to Pred(form.ComponentCount) do
  begin
    if (form.Components[i] is TDBEdit) then
      if (TDBEdit(form.Components[i]).Name = 'edtGrau' + IntToStr(i)) then //linha pode ser dispensada se só houver os 10 DBEdit's edtGrau no seu form
        TDBEdit(form.Components[i]).OnChange := nil; 
  end;
GOSTEI 0
Rafael Pimenta

Rafael Pimenta

14/07/2010

Aqueles... "como nao pensei nisso antes!?" rsrs
vlww amigo, deu certo! =]

 
GOSTEI 0
Alan Souza

Alan Souza

14/07/2010

do jeito que vc pensou anteriormente também dá, só usar:
for i := 0 to 10 do
 TDBEdit(FindComponent(edtGrau + IntToStr(i))).OnChange := nil;

(só não está testado)...
GOSTEI 0
Rafael Pimenta

Rafael Pimenta

14/07/2010

do jeito que vc pensou anteriormente também dá, só usar:
for i := 0 to 10 do
 TDBEdit(FindComponent(edtGrau + IntToStr(i))).OnChange := nil;

(só não está testado)...



Tinha testado na hora de desabilitar o evento(tando da forma q eu fiz quanto da sua) e deu certo!

Porem, fui testar aqui agora na hora de habilitar o OnChange novamente e não esta dando:

  for i := 1 to 10 do
  begin
    TDBEdit(FindComponent('edtGrau' + IntToStr(i))).OnChange :=
      FindComponent('edtGrau' + IntToStr(i) + 'Change');  <<< // Incompatible types: 'TNotifyEvent' and 'TComponent'
  end;


Achei que realmente não tem como fazer esse typecast... =/






GOSTEI 0
Alan Souza

Alan Souza

14/07/2010

o OnChange que vc está tentando passar é uma procedure (evento) e não um componente, por isso o erro.
Não creio que dê para fazer dessa forma mesmo, a não ser que vc faça uma função que retorne o TNotifyEvent correspondente através do nome ou mesmo da Tag do TDBEdit.
 
GOSTEI 0
Rafael Pimenta

Rafael Pimenta

14/07/2010

o OnChange que vc está tentando passar é uma procedure (evento) e não um componente, por isso o erro.
Não creio que dê para fazer dessa forma mesmo, a não ser que vc faça uma função que retorne o TNotifyEvent correspondente através do nome ou mesmo da Tag do TDBEdit.
 



Acho que vou na forma manual mesmo, desativando um evento por um e dpois reativando um por um e jogo as duas instrucoes em procedimentos, ou usando uma variavel boolean de controle.
Mas fica o post aberto pra caso alguem saiba como retornar o TNotifyEvent correspondente através do nome ou mesmo da Tag do TDBEdit.

Obrigado!
GOSTEI 0
Eriley Barbosa

Eriley Barbosa

14/07/2010

Se desabilitar os controles vinculados a query, não desabilita os eventos também?     //Desabilita OnChance de Todos TDBEdtis   SuaQuery.DisableControls;

  try

    // rotinas

  finally
    //Habilita OnChance de Todos TDBEdtis
    SuaQuery.Enablecontrols    
  end; Atenciosamente Eriley

GOSTEI 0
Pedro Saraiva.

Pedro Saraiva.

14/07/2010

Programa com códigos fontes Ola pessoal, você programador que quer um aplicativo exemplo para fins comerciais, tenho uma dica, compre o WinPhar que vem com todos os códigos fontes e faça um programa baseado nele, sim ele também vêm com todos os componentes para instalar, voce além de ganhar um programa complidao, ganha tb os seus códigos fontes e seus componentes. O programa foi desenvolvido em Delphi 7 com banco de dados paradox, e custa apenas 20,00 reais
deem uma olhadinha ai no produto
http://produto.mercadolivre.com.br/MLB-149256966-winphar-2008-sistema-para-farmacias-e-drogarias-_JM
e ente em contato pelo e-mail pedroluissaraiva@yahoo.com.br.!
GOSTEI 0
POSTAR