Fórum TypeCast #411342
09/01/2012
0
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
Curtir tópico
+ 0Posts
09/01/2012
Gustavo Bretas
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
10/01/2012
Wesley Yamazack
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
10/01/2012
Marco Salles
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
10/01/2012
Jose Medeiros
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
11/01/2012
Marco Salles
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
11/01/2012
Marco Salles
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
Clique aqui para fazer login e interagir na Comunidade :)