TypeCast
Boa noite,
Tenho um aplicação feita usando Herança de componentes, nessa aplicação no formulario padrão no evento onShow criei um TypeCast para rodar no evento onExit e onEnter umas procedures:
Procedure TFrmModelo.FormShow(Sender: TObject);
begin
//tdbcombobox
if Components[I]is TDBComboBox then
begin
TDBComboBox(Components[I]).OnEnter:=AplicaCor;
TDBComboBox(Components[I]).OnExit:=TiraCor;
end;
end;
Esse código reflete em todo cadastro que herdar desse formulario, esta funcionando 100%. o que estou necessitando e num cadastro de clientes usar um DBCombobox para executar um outro procedimento no evento onexit, e percebo que esse evento não funciona nesse cadastro. se eu retirar esse typecast funciona. mas preciso usar o type cast e poder acrescentar outros procedimentos nesse evento.
Teria como fazer isso?
Grato:
Tenho um aplicação feita usando Herança de componentes, nessa aplicação no formulario padrão no evento onShow criei um TypeCast para rodar no evento onExit e onEnter umas procedures:
Procedure TFrmModelo.FormShow(Sender: TObject);
begin
//tdbcombobox
if Components[I]is TDBComboBox then
begin
TDBComboBox(Components[I]).OnEnter:=AplicaCor;
TDBComboBox(Components[I]).OnExit:=TiraCor;
end;
end;
Esse código reflete em todo cadastro que herdar desse formulario, esta funcionando 100%. o que estou necessitando e num cadastro de clientes usar um DBCombobox para executar um outro procedimento no evento onexit, e percebo que esse evento não funciona nesse cadastro. se eu retirar esse typecast funciona. mas preciso usar o type cast e poder acrescentar outros procedimentos nesse evento.
Teria como fazer isso?
Grato:
Jose Medeiros
Curtidas 0
Respostas
Gustavo Bretas
09/01/2012
Jose Luiz,
Entendo que atribuir via código vc ganha tempo, mas para todo bônus tem o ônus.
No seu caso, se vc não estiver usando a propriedade TAG dos componentes, da para colocar uma condição no evento do formulário padrão da seguinte forma:
Então no componente que vc deseja utilizar os eventos de outra forma, coloque o valor 1 à tag para que o evento não seja atribuido, e nos eventos do componente vc pode fazer da seguinte forma:
Espero ter ajudado!
Entendo que atribuir via código vc ganha tempo, mas para todo bônus tem o ônus.
No seu caso, se vc não estiver usando a propriedade TAG dos componentes, da para colocar uma condição no evento do formulário padrão da seguinte forma:
if (Components[I]is TDBComboBox) and (TDBComboBox(Components[I]).Tag = 0) then begin ... end;
Então no componente que vc deseja utilizar os eventos de outra forma, coloque o valor 1 à tag para que o evento não seja atribuido, e nos eventos do componente vc pode fazer da seguinte forma:
procedure TForm1.DBComboBox1Enter(Sender: TObject); begin TFrmModelo.AplicaCor(TDBComboBox(Sender)); // Continua evento end; procedure TForm1.DBComboBox1Exit(Sender: TObject); begin TFrmModelo.TiraCor(TDBComboBox(Sender)); // Continua evento end;
Espero ter ajudado!
GOSTEI 0
Wesley Yamazack
09/01/2012
Olá Jose, em resposta a sua pergunta, muito tempo atrás eu fazia desta forma como você, porém como nos eventos você esta fazendo um Method Pointer, ou seja, apontando um metodo para outro, o metodo original acaba sendo anulado, pra resolver isso, podemos dar uma pernada no nosso compilador, como assim?
Primeiro, cria uma unit exatamente como esta abaixo
Salve a mesma como uTDBEdit;
Em seguida no seu formulário de Cliente por exemplo, você coloca seus DBEdits e tudo mais.
O Macete vem agora.
Como o Delphi le de cima para baixo, da esquerda pra direita, a última unit que ele irá interpretar é a uTDEdit, sendo assim ele irá usar os metodos desta unit, mas sem restringir o uso do metodo de cada DBEdit, entende?
Obs: Basta você adaptar e criar outras units para o TDBCombobox, TDBxxxxx, blz?
Assim você resolve seu problema.
Att,
Wesley Yamazack
www.lithic.com.br
Primeiro, cria uma unit exatamente como esta abaixo
unit uTDBEdit;
interface
uses DBCtrls, Graphics, uFuncoes, Messages, Windows, Classes;
type
TDBEdit = class(DBCtrls.TDBEdit)
protected
procedure DoEnter; override;
procedure DoExit; override;
private
FOldColor: TColor;
public
published
end;
implementation
{ TDBEdit }
procedure TDBEdit.DoEnter;
begin
inherited;
if not ReadOnly then
begin
FOldColor := Color;
Color := $00BAFEF5;
end
else
begin
FOldColor := Color;
Color := $00D4D4D4;
end;
end;
procedure TDBEdit.DoExit;
begin
inherited;
Color := FOldColor
end;
end.
Salve a mesma como uTDBEdit;
Em seguida no seu formulário de Cliente por exemplo, você coloca seus DBEdits e tudo mais.
O Macete vem agora.
unit uFrmMateriasPrimas;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, uFrmPadrao, DB, ImgList, ComCtrls, ExtCtrls, ToolWin, StdCtrls, Mask,
DBCtrls, FMTBcd, SqlExpr, Buttons, uFuncoes, Menus, uTDBEdit; { Veja que o último uses que eu coloquei foi exatamente o nome da Unit criada }
type
TFrmMateriasPrimas = class(TFrmPadrao)
Label2: TLabel;
Label3: TLabel;
DBEdit2: TDBEdit;
Como o Delphi le de cima para baixo, da esquerda pra direita, a última unit que ele irá interpretar é a uTDEdit, sendo assim ele irá usar os metodos desta unit, mas sem restringir o uso do metodo de cada DBEdit, entende?
Obs: Basta você adaptar e criar outras units para o TDBCombobox, TDBxxxxx, blz?
Assim você resolve seu problema.
Att,
Wesley Yamazack
www.lithic.com.br
GOSTEI 0
Marco Salles
09/01/2012
Certamente a melhor opção é utilizar o Overload da VCL ..
Utlizar Tag as vezes dificulda o Reuso e a legetibilidade e pode complicar em
futura manutenção
No seu TFrmModelo voce utiliza o conceito apresentado pelo WESLEY YAMAZACK e esses
controles no caso os DBEdits ficam com seus eventos livres para executar o que bem entende.
Utlizar Tag as vezes dificulda o Reuso e a legetibilidade e pode complicar em
futura manutenção
No seu TFrmModelo voce utiliza o conceito apresentado pelo WESLEY YAMAZACK e esses
controles no caso os DBEdits ficam com seus eventos livres para executar o que bem entende.
GOSTEI 0
Jose Medeiros
09/01/2012
Boa noite a todos,
O exemplo do wesley funcionou 100%, mas consegui com a dica de um colega em outro forúm uma maneira mais rapida e funcional para resolver o problema.
No formulario que herdar do formModelo, no evento onshow. colocar o seguinte código após o INHERITED.
TDbComboBox1.onexit:= TDBCombobox1Exit;
Fiz aqui e deu blz, não perco os precedimentos do formmodelo e acrescento o que quizer no evento onexit no form filho.
Lembrando que temos que colocar o nome do dbcombobox que deseja reativar o evento.
Fica essa ai para se guardar a sete chaves..
Obrigado a todos
O exemplo do wesley funcionou 100%, mas consegui com a dica de um colega em outro forúm uma maneira mais rapida e funcional para resolver o problema.
No formulario que herdar do formModelo, no evento onshow. colocar o seguinte código após o INHERITED.
TDbComboBox1.onexit:= TDBCombobox1Exit;
Fiz aqui e deu blz, não perco os precedimentos do formmodelo e acrescento o que quizer no evento onexit no form filho.
Lembrando que temos que colocar o nome do dbcombobox que deseja reativar o evento.
Fica essa ai para se guardar a sete chaves..
Obrigado a todos
GOSTEI 0
Marco Salles
09/01/2012
Mais uma vez voce esta utilizando do Recurso do Methodo Pointer
e esta anulando o evento onexit do form Padrão no Form Herdado
O grande problema desta estrátegia é que para utilizar o Evento
TIRACOR no componente DbComboBox1 voce tera que mencionar este
Methodo em seu evento Onexit , se se este evento for
privado voce tem que torna-lo visivel a classe Herdado. Perdendo
o encapsulamento . Se voce necessitar de fazer desta forma em
muitos forms todos eles terão que mencionar o TIRACOR . Esta
estratégia Foge do conceito POO e por estar em desacordo com POO
a solução no meu modo de ver não é a mais funcional.
e esta anulando o evento onexit do form Padrão no Form Herdado
O grande problema desta estrátegia é que para utilizar o Evento
TIRACOR no componente DbComboBox1 voce tera que mencionar este
Methodo em seu evento Onexit , se se este evento for
privado voce tem que torna-lo visivel a classe Herdado. Perdendo
o encapsulamento . Se voce necessitar de fazer desta forma em
muitos forms todos eles terão que mencionar o TIRACOR . Esta
estratégia Foge do conceito POO e por estar em desacordo com POO
a solução no meu modo de ver não é a mais funcional.
GOSTEI 0
Marco Salles
09/01/2012
Mais uma vez voce esta utilizando do Recurso do Methodo Pointer
e esta anulando o evento onexit do form Padrão no Form Herdado
O grande problema desta estrátegia é que para utilizar o Evento
TIRACOR no componente DbComboBox1 voce tera que mencionar este
Methodo em seu evento Onexit , se se este evento for
privado voce tem que torna-lo visivel a classe Herdado. Perdendo
o encapsulamento . Se voce necessitar de fazer desta forma em
muitos forms todos eles terão que mencionar o TIRACOR . Esta
estratégia Foge do conceito POO e por estar em desacordo com POO
a solução no meu modo de ver não é a mais funcional.
e esta anulando o evento onexit do form Padrão no Form Herdado
O grande problema desta estrátegia é que para utilizar o Evento
TIRACOR no componente DbComboBox1 voce tera que mencionar este
Methodo em seu evento Onexit , se se este evento for
privado voce tem que torna-lo visivel a classe Herdado. Perdendo
o encapsulamento . Se voce necessitar de fazer desta forma em
muitos forms todos eles terão que mencionar o TIRACOR . Esta
estratégia Foge do conceito POO e por estar em desacordo com POO
a solução no meu modo de ver não é a mais funcional.
GOSTEI 0