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