| Exibir mensagem anterior :: Exibir próxima mensagem | 
	
	
		| Autor | Mensagem | 
	
		| Rogazzi Novato
 
  
 
 Registrado: Quarta-Feira, 10 de Março de 2004
 Mensagens: 50
 
 
 | 
			
				|  Enviada: Qui Out 17, 2019 12:19 pm    Assunto: Herança |   |  
				| 
 |  
				| Olá Pessoal!! 
 Alguém pode me ajudar?
 
 Tenho um formPai com eventos no OnExit dos componetes (Para mudar a cor quando recebe e quandosai o foco), porém tenho um evento no OnExit do FormFilho que deveria executar uma função para validação de CPF_CNPJ, mas este evento não é chamado por causa do evento no FormPai.
 
 Como posso resolver isso.
 
 Muito Obrigado.
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Sex Out 18, 2019 9:19 am    Assunto: |   |  
				| 
 |  
				| Bom dia, 
 Acho que você tem que postar mais informações, como o tipo de componente em questão utilizado nos Forms pai e filho, e o código utilizado nos eventos.
 
 Editado pela última vez por imex em Dom Fev 25, 2024 3:53 pm, num total de 1 vez
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| jheckson Novato
 
  
 
 Registrado: Domingo, 30 de Outubro de 2016
 Mensagens: 27
 
 
 | 
			
				|  Enviada: Sex Out 18, 2019 9:28 am    Assunto: Re: Herança |   |  
				| 
 |  
				|  	  | Rogazzi escreveu: |  	  | Olá Pessoal!! 
 Alguém pode me ajudar?
 
 Tenho um formPai com eventos no OnExit dos componetes (Para mudar a cor quando recebe e quandosai o foco), porém tenho um evento no OnExit do FormFilho que deveria executar uma função para validação de CPF_CNPJ, mas este evento não é chamado por causa do evento no FormPai.
 
 Como posso resolver isso.
 
 Muito Obrigado.
 | 
 
 caso você tenha removido no form filho a instrução inherited do evento, não será executado.
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| Rogazzi Novato
 
  
 
 Registrado: Quarta-Feira, 10 de Março de 2004
 Mensagens: 50
 
 
 | 
			
				|  Enviada: Sex Out 18, 2019 10:26 am    Assunto: |   |  
				| 
 |  
				| No formPai está assim: 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, DBCtrls, IniFiles, Data.DB, Vcl.DBGrids;
 
 type
 TFormMaster = class(TForm)
 procedure FormClose(Sender: TObject; var Action: TCloseAction);
 procedure FormKeyPress(Sender: TObject; var Key: Char);
 procedure MudaFoco;
 procedure FormShow(Sender: TObject);
 private
 { Private declarations }
 procedure EnterEx(Sender: TObject);
 procedure ExitEx(Sender: TObject);
 public
 { Public declarations }
 end;
 
 var
 FormMaster: TFormMaster;
 strCorEntrada, strCorSaida: String;
 booEndereco: Boolean;
 
 implementation
 
 {$R *.dfm}
 
 procedure ScaleForm(AForm: TForm);
 var
 intX, intY, intSW, intPorcento: integer;
 nEscala: Double;
 ArqIni: TIniFile;
 strRel: String;
 begin
 ArqIni := TIniFile.Create('C:\Novo Sicap\Arquivo.ini');
 try
 strRel := ArqIni.ReadString('Dados', 'Texto', '');
 finally
 ArqIni.Free;
 end;
 intSW := StrToInt(strRel);
 AForm.Scaled := True;
 
 if (Screen.Width <intSW> 0) then
 begin
 for intX := 0 to TDBGrid(AForm.Components[intY]).Columns.Count -1
 do
 TDBGrid(AForm.Components[intY]).Columns[intX].Width:=
 Round(TDBGrid(AForm.Components[intY]).Columns[intX].Width *
 (intPorcento / 100));
 end;
 end;
 end;
 end;
 
 procedure TFormMaster.FormClose(Sender: TObject; var Action: TCloseAction);
 begin
 FormMaster := Nil;
 Action := caFree;
 end;
 
 procedure TFormMaster.FormKeyPress(Sender: TObject; var Key: Char);
 begin
 if key = #13 then
 begin
 Key:= #0;
 Perform(Wm_NextDlgCtl, 0, 0);
 end;
 case Key of
 'á': Key := 'a';
 'é': Key := 'e';
 'í': Key := 'i';
 'ó': Key := 'o';
 'ú': Key := 'u';
 'à': Key := 'a';
 'è': Key := 'e';
 'ì': Key := 'i';
 'ò': Key := 'o';
 'ù': Key := 'u';
 'â': Key := 'a';
 'ê': Key := 'e';
 'î': Key := 'i';
 'ô': Key := 'o';
 'û': Key := 'u';
 'ä': Key := 'a';
 'ë': Key := 'e';
 'ï': Key := 'i';
 'ö': Key := 'o';
 'ü': Key := 'u';
 'ã': Key := 'a';
 'õ': Key := 'o';
 'ñ': Key := 'n';
 'Á': Key := 'A';
 'É': Key := 'E';
 'Í': Key := 'I';
 'Ó': Key := 'O';
 'Ú': Key := 'U';
 'À': Key := 'A';
 'È': Key := 'E';
 'Ì': Key := 'I';
 'Ò': Key := 'O';
 'Ù': Key := 'U';
 'Â': Key := 'A';
 'Ê': Key := 'E';
 'Î': Key := 'I';
 'Ô': Key := 'O';
 'Û': Key := 'U';
 'Ä': Key := 'A';
 'Ë': Key := 'E';
 'Ï': Key := 'I';
 'Ö': Key := 'O';
 'Ü': Key := 'U';
 'Ã': Key := 'A';
 'Õ': Key := 'O';
 'Ñ': Key := 'N';
 'ç': key := 'Ç';
 end;
 end;
 
 procedure TFormMaster.FormShow(Sender: TObject);
 begin
 MudaFoco;
 end;
 
 procedure TFormMaster.MudaFoco;
 var
 intI: Integer;
 begin
 for intI := 0 to ComponentCount -1 do
 begin
 if (Components[intI] is TEdit) then
 begin
 (Components[intI] as TEdit).OnExit := ExitEx;
 (Components[intI] as TEdit).OnEnter := EnterEx;
 end;
 if (Components[intI] is TMemo) then
 begin
 (Components[intI] as TMemo).OnExit := ExitEx;
 (Components[intI] as TMemo).OnEnter := EnterEx;
 end;
 if (Components[intI] is TDBEdit) then
 begin
 (Components[intI] as TDBEdit).OnExit := ExitEx;
 (Components[intI] as TDBEdit).OnEnter := EnterEx;
 end;
 if (Components[intI] is TDBMemo) then
 begin
 (Components[intI] as TDBMemo).OnExit := ExitEx;
 (Components[intI] as TDBMemo).OnEnter := EnterEx;
 end;
 if (Components[intI] is TDBComboBox) then
 begin
 (Components[intI] as TDBComboBox).OnExit := ExitEx;
 (Components[intI] as TDBComboBox).OnEnter := EnterEx;
 end;
 if (Components[intI] is TComboBox) then
 begin
 (Components[intI] as TComboBox).OnExit := ExitEx;
 (Components[intI] as TComboBox).OnEnter := EnterEx;
 end;
 end;
 end;
 
 procedure TFormMaster.EnterEx(Sender: TObject);
 begin
 strCorEntrada := '$00D2FAFA';
 if (Sender is TEdit) then
 (Sender as TEdit).Color := StringToColor(strCorEntrada);
 if (Sender is TMemo) then
 (Sender as TMemo).Color := StringToColor(strCorEntrada);
 if (Sender is TDBEdit) then
 (Sender as TDBEdit).Color := StringToColor(strCorEntrada);
 if (Sender is TDBMemo) then
 (Sender as TDBMemo).Color := StringToColor(strCorEntrada);
 if (Sender is TComboBox) then
 (Sender as TComboBox).Color := StringToColor(strCorEntrada);
 if (Sender is TDBComboBox) then
 (Sender as TDBComboBox).Color := StringToColor(strCorEntrada);
 end;
 
 procedure TFormMaster.ExitEx(Sender: TObject);
 begin
 strCorSaida := 'clWindow';
 if (Sender is TEdit) then
 (Sender as TEdit).Color := StringToColor(strCorSaida);
 if (Sender is TMemo) then
 (Sender as TMemo).Color := StringToColor(strCorSaida);
 if (Sender is TDBEdit) then
 (Sender as TDBEdit).Color := StringToColor(strCorSaida);
 if (Sender is TDBMemo) then
 (Sender as TDBMemo).Color := StringToColor(strCorSaida);
 if (Sender is TComboBox) then
 (Sender as TComboBox).Color := StringToColor(strCorSaida);
 if (Sender is TDBComboBox) then
 (Sender as TDBComboBox).Color := StringToColor(strCorSaida);
 end;
 end.
 
 No FormFilho esta assim
 TFormFilho = class(TFormPai)
 
 procedure TFormCadCliente.CNPJExit(Sender: TObject);
 begin
 inherited;
 ValidaCNPJ(txtCNPJ.Text)
 end;
 
 Porém o evento OnExit no Filho não é chamdo.
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Sex Out 18, 2019 11:41 am    Assunto: |   |  
				| 
 |  
				| Acredito que o método CNPJExit não está sendo executado porque o MudaFoco troca o método executado no OnExit para EnterEx, substituindo o que estava programado em design. Que tipo de componente é CNPJ?
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| Rogazzi Novato
 
  
 
 Registrado: Quarta-Feira, 10 de Março de 2004
 Mensagens: 50
 
 
 | 
			
				|  Enviada: Sex Out 18, 2019 4:04 pm    Assunto: |   |  
				| 
 |  
				| O componente do campo CNPJ_CPF é um DBText 
 Eu imaginei que no form pai tem um processo que faz trocar as cores dos campos nos forms filho. Foi por isso que eu perguntei como posso fazer para simular no evento onExit do formFilho um outro processo.
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Sex Out 18, 2019 5:55 pm    Assunto: |   |  
				| 
 |  
				| Acho que uma alternativa seria utilizar um If na MudaFoco para atribuir o seu método ao evento somente se não existir outro método atribuído. Exemplo (considerando que os componentes do seu código descendem de TWinControl): 
 
  	  | Código: |  	  | procedure TFormMaster.MudaFoco; var
 intI: Integer;
 begin
 for intI := 0 to ComponentCount -1 do
 if (Components[intI] is TEdit)       or
 (Components[intI] is TDBEdit)     or
 (Components[intI] is TMemo)       or
 (Components[intI] is TDBMemo)     or
 (Components[intI] is TComboBox)   or
 (Components[intI] is TDBComboBox) then
 begin
 with Components[intI] as TWinControl do
 begin
 if OnExit = nil then
 OnExit := ExitEx;
 if OnEnter = nil then
 OnEnter := EnterEx;
 end;
 end;
 end;
 | 
 
 E para complementar seria necessário chamar o método manualmente no Exit personalizado:
 
 
  	  | Código: |  	  | procedure TFormCadCliente.CNPJExit(Sender: TObject); begin
 inherited;
 
 ValidaCNPJ(txtCNPJ.Text);
 ExitEx(Sender);
 end;
 | 
 
 Mas como você está utilizando Data Controls (TDBEdit, etc), acredito que seria melhor fazer a validação (no caso do CNPJ) no evento OnValidate do Field e não no OnExit do componente.
 
 Espero que ajude
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| Rogazzi Novato
 
  
 
 Registrado: Quarta-Feira, 10 de Março de 2004
 Mensagens: 50
 
 
 | 
			
				|  Enviada: Ter Out 29, 2019 2:16 pm    Assunto: Resolvido!! |   |  
				| 
 |  
				| Pessola, resolvi da seguinte forma. 
 Criei uma Unit para Mudar a Cor dos Campos:
 
 unit UMudarCorCampos;
 
 interface
 
 uses
 Vcl.DBCtrls, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.Mask, Vcl.Graphics;
 
 const
 // Variável para inserir a cor do Foco na entrada do componte
 strCorEntrada: String = '$00D2FAFA';
 // Variável para inserir a cor do Foco na saída do componte
 strCorSaida: String = 'clWindow';
 
 type
 
 TDBEdit = class(Vcl.DBCtrls.TDBEdit)
 protected
 procedure DoEnter; override;
 procedure DoExit; override;
 end;
 
 TLabeledEdit = class(Vcl.ExtCtrls.TLabeledEdit)
 protected
 procedure DoEnter; override;
 procedure DoExit; override;
 end;
 
 TComboBox = class(Vcl.StdCtrls.TComboBox)
 protected
 procedure DoEnter; override;
 procedure DoExit; override;
 end;
 
 TDBComboBox = class(Vcl.DBCtrls.TDBComboBox)
 protected
 procedure DoEnter; override;
 procedure DoExit; override;
 end;
 
 TDBLookupComboBox = class(Vcl.DBCtrls.TDBLookupComboBox)
 protected
 procedure DoEnter; override;
 procedure DoExit; override;
 end;
 
 TMaskEdit = class(Vcl.Mask.TMaskEdit)
 protected
 procedure DoEnter; override;
 procedure DoExit; override;
 end;
 
 implementation
 
 procedure TDBComboBox.DoEnter;
 begin
 inherited;
 Self.Color := StringToColor(strCorEntrada);
 end;
 
 procedure TDBComboBox.DoExit;
 begin
 inherited;
 Self.Color := StringToColor(strCorSaida);
 end;
 
 procedure TDBEdit.DoEnter;
 begin
 inherited;
 Self.Color := StringToColor(strCorEntrada);
 end;
 
 procedure TDBEdit.DoExit;
 begin
 inherited;
 Self.Color := StringToColor(strCorSaida);
 end;
 
 procedure TLabeledEdit.DoEnter;
 begin
 inherited;
 Self.Color := StringToColor(strCorEntrada);
 end;
 
 procedure TLabeledEdit.DoExit;
 begin
 inherited;
 Self.Color := StringToColor(strCorSaida);
 end;
 
 procedure TComboBox.DoEnter;
 begin
 inherited;
 Self.Color := StringToColor(strCorEntrada);
 end;
 
 procedure TComboBox.DoExit;
 begin
 inherited;
 Self.Color := StringToColor(strCorSaida);
 end;
 
 procedure TDBLookupComboBox.DoEnter;
 begin
 inherited;
 Self.Color := StringToColor(strCorEntrada);
 end;
 
 procedure TDBLookupComboBox.DoExit;
 begin
 inherited;
 Self.Color := StringToColor(strCorSaida);
 end;
 
 procedure TMaskEdit.DoEnter;
 begin
 inherited;
 Self.Color := StringToColor(strCorEntrada);
 end;
 
 procedure TMaskEdit.DoExit;
 begin
 inherited;
 Self.Color := StringToColor(strCorSaida);
 end;
 
 end.
 
 Depois é só chamar a Unit no Uses do Form que você quer utilizar.
 
 Vale a dica se aguém precisar.
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| wjuniordias Profissional
 
  
  
 Registrado: Sexta-Feira, 16 de Março de 2012
 Mensagens: 667
 
 
 | 
			
				|  Enviada: Qui Nov 14, 2019 10:11 am    Assunto: Re: Resolvido!! |   |  
				| 
 |  
				| Este recurso se chama class interposer, no qual o compilador "une" a classe original com os esses recursos agregados, sendo assim, para garantia de funcionamento, essa unit deve ser a última na declaração da seção "uses". Abraço.
 _________________
 "O sábio nunca diz tudo o que pensa, mas pensa sempre tudo o que diz." (Aristóteles)
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		|  |