Sei sulla pagina 1di 7

23/05/2018 ActiveDelphi :: Exibir tópico - {Resolvido} Acertar mascara em dbgrid

ActiveDelphi
.: O site do programador Delphi! :.

FAQ Pesquisar Membros Grupos Registrar


Perfil Entrar e ver Mensagens Particulares Entrar

{Resolvido} Acertar mascara em dbgrid

ActiveDelphi - Índice do Fórum -> Delphi

Exibir mensagem anterior :: Exibir próxima mensagem

Autor Mensagem

leo_bruno Enviada: Dom Mai 04, 2014 2:41 am Assunto: {Resolvido} Acertar mascara em dbgrid
Profissional

PessoALL:
Registrado: Sexta-Feira, 16
de Abril de 2010 Acho que não fui muito específico, então estou editando o tópico pra explicar melhor.
Mensagens: 658

Num dbgrid eu tenho telefones com 10 digitos e com 11 digitos.


Eu queria de algum modo ao trazer cada linha, editar a mascara para aquela linha especifica.

De todas as maneiras que tentei fazer, eu acabo setando a mascara para todas as linhas do grid, o que não
serve, pois eu posso ter por exemplo na linha de numero 1, um telefone com 10 digitos e na linha de numero
2 um telefone de 11 digitos e assim por diante.

Eu tentei o evento on draw data cell e on draw column cell, mas nao deu certo.

Alguma dica ?

-----------------------------------------------------------------------------------
Olá pessoALL :

Eu estou tentando criar uma procedure pra acertar as mascaras dos telefones pra mim (5 digitos ou 4digitos).

Nao estou conseguindo.

Eu queria fazer o seguinte:

Criar uma procedure onde passo o campo (de uma query ou clientdataset) como parametro e ela conta os
caracteres.

Se = 10 recebe uma mascara.


Se > 10 recebe outra.

Dai eu chamaria a procedure no evento after scroll do dataset.

O problema é que nos testes realizados com o codigo a seguir vem tudo 0.

Alguem pode me ajudar ?

Código:

//esta unit é a procedure


unit UprcSetaMascaraTelefone;

interface
uses
Data.DB, Vcl.Dialogs, System.SysUtils, Datasnap.DBClient;

procedure prcSetaMascaraTelefone(Campo : TField);

implementation

procedure prcSetaMascaraTelefone(Campo : TField);


begin
ShowMessage(inttostr(Length(Campo.AsString)));
end;

http://www.activedelphi.com.br/forum/viewtopic.php?t=85933&sid=93abaa6155aadc70a51abe220a6e0ad2 1/7
23/05/2018 ActiveDelphi :: Exibir tópico - {Resolvido} Acertar mascara em dbgrid

e eu chamo ela assim:

Código:

procedure TdmCadastros.CdsCadastroClienteAfterScroll(DataSet: TDataSet);


begin prcSetaMascaraTelefone(CdsCadastroCliente.FieldByName('num_telefone_1'));
end;

Editado pela última vez por leo_bruno em Seg Mai 05, 2014 7:10 pm, num total de 2 vezes

Voltar ao Topo

rique_neves Enviada: Dom Mai 04, 2014 8:52 pm Assunto: Re: procedure para acertar mascara de telefone
Mestre

Código:
procedure TForm1.Edit1Change(Sender: TObject);
begin
if (Length(Edit1.Text) = 1) then
begin
if Edit1.Text[1] = '(' then
Edit1.Text := ''
Registrado: Sexta-Feira, 17
else
de Fevereiro de 2012
begin
Mensagens: 870
Edit1.Text := '('+Edit1.text;
Edit1.SelStart := Length(Edit1.text);
end;
end;
if Length(Edit1.Text) = 3 then
begin
Edit1.Text := Edit1.text+') ';
Edit1.SelStart := Length(Edit1.text);
end;
if Length(Edit1.Text) = 9 then
begin
Edit1.text := Edit1.text+'-';
Edit1.SelStart := Length(Edit1.Text);
end;
end;

veja também:
http://www.showdelphi.com.br/dica/object-pascal/62/funcao-que-aplica-mascara-a-numeros-de-telefone-
delphi
Citação:
{ Aplicando a mascara a números de telefone. }

function GetTelWithMasc(FoneNumber: String): String;


begin
case Length(FoneNumber) of
7, 8 : Insert('-', FoneNumber, Length(FoneNumber) - 3);
9, 10 : begin
Insert('-', FoneNumber, Length(FoneNumber) - 3);
Insert('(', FoneNumber, 1);
Insert(')', FoneNumber, 4);
Insert(' ', FoneNumber, 5);
end;
end;

Result := FoneNumber;
end;

// Exemplo

procedure TForm1.Button1Click(Sender: TObject);


begin
{ Com DDD }
ShowMessage(GetTelWithMasc('9999999999'));

{ Sem DDD }
ShowMessage(GetTelWithMasc('99999999'));
end;

espero que ajude.


_________________
Atrás de todo problema a uma oportunidade brilhantemente disfarçada!
Compartilhar Imagens .: http://s124.photobucket.com/

Voltar ao Topo

leo_bruno Enviada: Dom Mai 04, 2014 10:37 pm Assunto: Re: procedure para acertar mascara de telefone
Profissional

rique_neves escreveu:

http://www.activedelphi.com.br/forum/viewtopic.php?t=85933&sid=93abaa6155aadc70a51abe220a6e0ad2 2/7
23/05/2018 ActiveDelphi :: Exibir tópico - {Resolvido} Acertar mascara em dbgrid
Registrado: Sexta-Feira, 16 Código:
de Abril de 2010
Mensagens: 658 procedure TForm1.Edit1Change(Sender: TObject);
begin
if (Length(Edit1.Text) = 1) then
begin
if Edit1.Text[1] = '(' then
Edit1.Text := ''
else
begin
Edit1.Text := '('+Edit1.text;
Edit1.SelStart := Length(Edit1.text);
end;
end;
if Length(Edit1.Text) = 3 then
begin
Edit1.Text := Edit1.text+') ';
Edit1.SelStart := Length(Edit1.text);
end;
if Length(Edit1.Text) = 9 then
begin
Edit1.text := Edit1.text+'-';
Edit1.SelStart := Length(Edit1.Text);
end;
end;

veja também:
http://www.showdelphi.com.br/dica/object-pascal/62/funcao-que-aplica-mascara-a-numeros-de-
telefone-delphi
Citação:
{ Aplicando a mascara a números de telefone. }

function GetTelWithMasc(FoneNumber: String): String;


begin
case Length(FoneNumber) of
7, 8 : Insert('-', FoneNumber, Length(FoneNumber) - 3);
9, 10 : begin
Insert('-', FoneNumber, Length(FoneNumber) - 3);
Insert('(', FoneNumber, 1);
Insert(')', FoneNumber, 4);
Insert(' ', FoneNumber, 5);
end;
end;

Result := FoneNumber;
end;

// Exemplo

procedure TForm1.Button1Click(Sender: TObject);


begin
{ Com DDD }
ShowMessage(GetTelWithMasc('9999999999'));

{ Sem DDD }
ShowMessage(GetTelWithMasc('99999999'));
end;

espero que ajude.

Amigo, valeu pela boa vontade, mas não gostei da abordagem.

O código que postei é só um exemplo, eu vou usar a funcao editmask do delphi.

Eu quero uma função que se aplique a um Tfield de um dataset, ou seja, quero fazer o tratamento da
mascara direto no dataset que pode ser uma querySql ou mesmo um ClientDatasset. Desta forma, se o
campo onde setei a mascara aparecer em um DbGrid, ou DbEdit, ou qualquer outro componente DataAware,
poderei usar a funcao.

Preciso montar a logica pro meu exemplo funcionar.

Obrigado !

Voltar ao Topo

rique_neves Enviada: Dom Mai 04, 2014 11:22 pm Assunto: Re: procedure para acertar mascara de telefone
Mestre

certo, si intendi bem . Porque nao utiliza a propriedade EditMask do proprio componente, ai montaria a
mascara para todos os telefones.

http://www.activedelphi.com.br/forum/viewtopic.php?t=85933&sid=93abaa6155aadc70a51abe220a6e0ad2 3/7
23/05/2018 ActiveDelphi :: Exibir tópico - {Resolvido} Acertar mascara em dbgrid
So inserir isso na propriedade.

Código:
!\(999\)0000-0000;0;_

Registrado: Sexta-Feira, 17
de Fevereiro de 2012
Mensagens: 870 também não ?
_________________
Atrás de todo problema a uma oportunidade brilhantemente disfarçada!
Compartilhar Imagens .: http://s124.photobucket.com/

Voltar ao Topo

leo_bruno Enviada: Dom Mai 04, 2014 11:24 pm Assunto: Re: procedure para acertar mascara de telefone
Profissional

rique_neves escreveu:
Registrado: Sexta-Feira, 16 certo, si intendi bem . Porque nao utiliza a propriedade EditMask do proprio componente, ai montaria a
de Abril de 2010 mascara para todos os telefones.
Mensagens: 658
So inserir isso na propriedade.

Código:
!\(999\)0000-0000;0;_

também não ?

mais ou menos isso, mas o problema não esta na mascara, esta em passar o field como parametro.

quero fazer tipo isso: (sei que a mascara nao esta correta, mas é so exemplo)
if length(field.text) = 10 then field.editmask := (00)0000-00009 else
if length(field.text) = 11 then field.editmask := (00)00000-0000 ;

e assim vamos ...

estou trabalhando aqui na funcao.

Posto o resultado.

Voltar ao Topo

rique_neves Enviada: Dom Mai 04, 2014 11:35 pm Assunto: Re: procedure para acertar mascara de telefone
Mestre

Será que o problema nao está por você está colocando os 999 por exemplo que nesse caso o campo fica
como obrigatorio. Em qual evento você está fazendo a parametrizacao?É pra funcionar

Código:
Registrado: Sexta-Feira, 17
!\(###\) ####-####;0;_
de Fevereiro de 2012
Mensagens: 870 //com 11
Código:
!\(###\) #-####-####;0;_
// com 12 - 9 digito celular
Código:
!\(##\) #-####-####;0;_
// sem o 0 do DDD - 9 digitos
Código:
!\(##\) ####-####;0;_
//com 11 sem o 0 do DDD normal

São as possibilidades de telefones. Si voce usar a propriedade dará menos trabalho, mas pra usar pssar por
parametro é sucegado!
_________________
Atrás de todo problema a uma oportunidade brilhantemente disfarçada!
Compartilhar Imagens .: http://s124.photobucket.com/

Editado pela última vez por rique_neves em Dom Mai 04, 2014 11:43 pm, num total de 1 vez

Voltar ao Topo

http://www.activedelphi.com.br/forum/viewtopic.php?t=85933&sid=93abaa6155aadc70a51abe220a6e0ad2 4/7
23/05/2018 ActiveDelphi :: Exibir tópico - {Resolvido} Acertar mascara em dbgrid

leo_bruno Enviada: Dom Mai 04, 2014 11:42 pm Assunto: Re: procedure para acertar mascara de telefone
Profissional

rique_neves escreveu:
Registrado: Sexta-Feira, 16 eu monta a mascara pra vc com 10 ou 11 caracteres ou mais menos .
de Abril de 2010
Mensagens: 658 Será que o problema nao está por você está colocando os 999 por exemplo que nesse caso o campo fica
como obrigatorio

Esta é a unit:
Código:

unit UprcSetaMascaraTelefone;

interface
uses
Data.DB, System.SysUtils;

procedure prcSetaMascaraTelefone(Campo : TField);

implementation

procedure prcSetaMascaraTelefone(Campo : TField);


begin
case Length(trim(Campo.Text)) of
10 : Campo.EditMask := '\(00\)0000-00009;0;_';
11 : Campo.EditMask := '\(00\)00000-0000;0;_';
else Campo.EditMask := '\(00\)000000009;0;_';
end;

end;

end.

gravo no banco sem a mascara(apenas os numeros).

coloco essa procedure no afterscroll da query e se quiser pode por no keypress do dbedit.

onde a mascara tem 0, é obrigado a digitar um numero, onde tem 9 é facultativo.

Se o valor salvo no banco tiver 11 posicoes ele ira mostrar com 5 digitos no prefixo, se tiver 10 ira mostrar
com 4 digitos no prefixo.

No keypress, keyup ou keydown (ainda nao sei em qual evento vou colocar), como vai estar em branco, ele
ira mostrar apenas os ( ) do DDD e ira obrigar a digitar pelomenos 10 digitos, deixando o 11° a criterio do
usuario.

Este não é o meu problema, como pode ver isso esta resolvido.

Isso trata a mascara de maneira eficaz quando o componente é um dbedit.

Quando é um grid, se na linha de cima o telefone tiver 10 digitos e na atual tiver 11, como eu chamo a
procedure que acerta a mascara no after scroll, todas as linhas ficam com a mascara da linha atual.

Got it ?

Voltar ao Topo

rique_neves Enviada: Dom Mai 04, 2014 11:50 pm Assunto: Re: procedure para acertar mascara de telefone
Mestre

porque nao passa a funcao no onValidate do componente, sendo assim ele vai verificar a informacao e
mascarar! não daria certo?
_________________
Atrás de todo problema a uma oportunidade brilhantemente disfarçada!
Compartilhar Imagens .: http://s124.photobucket.com/
Registrado: Sexta-Feira, 17
de Fevereiro de 2012
Mensagens: 870

Voltar ao Topo

leo_bruno Enviada: Seg Mai 05, 2014 12:47 am Assunto: Re: procedure para acertar mascara de telefone
Profissional

rique_neves escreveu:
Registrado: Sexta-Feira, 16 porque nao passa a funcao no onValidate do componente, sendo assim ele vai verificar a informacao e
de Abril de 2010

http://www.activedelphi.com.br/forum/viewtopic.php?t=85933&sid=93abaa6155aadc70a51abe220a6e0ad2 5/7
23/05/2018 ActiveDelphi :: Exibir tópico - {Resolvido} Acertar mascara em dbgrid
Mensagens: 658 mascarar! não daria certo?

Eu editei o enunciado do tópico pois achei que não estava muito claro.

Voltar ao Topo

imex Enviada: Seg Mai 05, 2014 11:30 am Assunto:


Moderador

Bom dia,

Registrado: Sexta-Feira, 7 Experimente utilizar o evento OnGetText do Field mais ou menos como segue:
de Janeiro de 2011
Mensagens: 10850
Código:
var
Mascara: string;
begin
if DisplayText then
begin
case Length(trim(Sender.AsString)) of
10 : Mascara := '\(00\)0000-00009;0;_';
11 : Mascara := '\(00\)00000-0000;0;_';
else Mascara := '\(00\)000000009;0;_';
end;
Text := FormatMaskText(Mascara, Sender.AsString)
end
else
Text := Sender.AsString;

Espero que ajude.

_________________
Assinatura: http://www.imoveisemexposicao.com.br/imoveis-venda-guarulhos-terreno

Voltar ao Topo

leo_bruno Enviada: Seg Mai 05, 2014 7:09 pm Assunto:


Profissional

imex escreveu:
Registrado: Sexta-Feira, 16 Bom dia,
de Abril de 2010
Mensagens: 658 Experimente utilizar o evento OnGetText do Field mais ou menos como segue:

Código:
var
Mascara: string;
begin
if DisplayText then
begin
case Length(trim(Sender.AsString)) of
10 : Mascara := '\(00\)0000-00009;0;_';
11 : Mascara := '\(00\)00000-0000;0;_';
else Mascara := '\(00\)000000009;0;_';
end;
Text := FormatMaskText(Mascara, Sender.AsString)
end
else
Text := Sender.AsString;

Espero que ajude.

_________________
Assinatura: http://www.imoveisemexposicao.com.br/imoveis-venda-guarulhos-terreno

Viva a sabedoria !!!

Valeu Imex !!!

Funcionou perfeitamente.

Fiz o seguinte:

No onGetText do campo eu chamo a procedure que você ensinou.


No evento OnEnter do dbEdit, eu coloco a mascara "(00)000000009" sem o "-", obrigando o usuário a digitar
10 digitos e deixando o 11º opcional.

http://www.activedelphi.com.br/forum/viewtopic.php?t=85933&sid=93abaa6155aadc70a51abe220a6e0ad2 6/7
23/05/2018 ActiveDelphi :: Exibir tópico - {Resolvido} Acertar mascara em dbgrid

Quando sai do campo, ele ja fica com a mascara correta e todos os telefones no grid ficaram com a mascara
correta.

Anexa a unit.

Obrigado ao Imex e ao rique_neves.

Código:

unit UprcSetaMascaras;

interface
uses
Data.DB,System.SysUtils,System.MaskUtils;

procedure prcSetaMascaraTelefoneOnGetText(Sender: TField; var Text: string; DisplayText:


Boolean);
procedure prcSetaMascaraTelefoneOnEnter(Campo : TField);

implementation

procedure prcSetaMascaraTelefoneOnGetText(Sender: TField; var Text: string; DisplayText:


Boolean);
var
Mascara: string;
begin
{Utilizar no evento ONGetText do campo
prcSetaMascaraTelefone(Sender,text,DisplayText);
}
if DisplayText then
begin
case Length(trim(Sender.AsString)) of
10 : Mascara := '\(00\)0000-00009;0;_';
11 : Mascara := '\(00\)00000-0000;0;_';
else Mascara := '\(00\)000000009;0;_';
end;
Text := FormatMaskText(Mascara, Sender.AsString)
end
else
Text := Sender.AsString;
end;

procedure prcSetaMascaraTelefoneOnEnter(Campo : TField);


begin
{Utilizar no evento ONEnter do DBEdit
prcSetaMascaraTelefoneOnEnter(query.FieldByName('num_telefone_1'));
}
Campo.EditMask := '\(00\)000000009;0;_';
end;

Voltar ao Topo

Mostrar os tópicos anteriores: Todas as mensagens Antigas primeiro Ir

Todos os horários são GMT - 3 Horas


ActiveDelphi - Índice do Fórum -> Delphi

Página 1 de 1

Ir para: Delphi Ir

Enviar Mensagens Novas: Proibido.


Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.

Powered by phpBB © 2001, 2005 phpBB Group


Traduzido por: Suporte phpBB

http://www.activedelphi.com.br/forum/viewtopic.php?t=85933&sid=93abaa6155aadc70a51abe220a6e0ad2 7/7

Potrebbero piacerti anche