GARANTIR DESCONTO

Fórum TypeCast #411342

09/01/2012

0

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:
Jose Medeiros

Jose Medeiros

Responder

Posts

09/01/2012

Gustavo Bretas

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:

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!
Responder

Gostei + 0

10/01/2012

Wesley Yamazack

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


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
Responder

Gostei + 0

10/01/2012

Marco Salles

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.
Responder

Gostei + 0

10/01/2012

Jose Medeiros

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
Responder

Gostei + 0

11/01/2012

Marco Salles

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.
Responder

Gostei + 0

11/01/2012

Marco Salles

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.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar