Formata máscara para exibir em um DBGrid? - Fórum DevMedia
Formata máscara para exibir em um DBGrid?
Olá amigos tô com o seguinte problema, eu criei uma tabela(tbMascara com os compos: CodMascara, TipoMascara, Mascara) onde gostaria de salvar os tipos de máscaras:
1 | CPF | 000\.000\.000\-00;1;_
2 | CGC | 00\.000\.000\-0000\-00;1;_
3 | TELEFONE | !\(99\) 9000-0000;1;_
4 | EMAIL |
e criei uma tabela (tbContato com os campos: CodContato, CodMascara, Contato) onde de acordo com o CodMascara selecionado ele vai formata o compo ´Contato´ para serem exibidos em um DBGrid. Alguém poderia me dar alguma dica de como resolver esse problema?
Considerando que as tabelas já estão referenciadas, no evento AfterScroll da tabela tbContato coloque
[b:43a0f4cd9f]tbContatoContato.editmask := tbMascaraMascara.value;[/b:43a0f4cd9f]
Acredito que funcionará bem para seu caso.
Não deu certo, eu consegui +/- um resultado usando a função FormatMaskText + ainda não é o desejado.
Cara da pra vc usa o propriedade do field.
Va na propriedade do field e em editmask e coloca a mascara la.
Dart, ele não pode colocar como uma propriedade fixa, pois ela varia de acordo com o tipo de conteudo do campo, por isso minha dica foi justamente alterar o EditMask lá do campo da tabela, porém sempre que houver uma mudança de registro o editmask seria alterado para o novo valor.
Pessoal consegui chegar perto do resultado usando esse código aqui:
tbMask.Open;
tbcontato.First;
while not tbcontato.Eof do
tbContato.Edit;
tbmask.Locate(´codmask´,tbContatoCodMask.Value,[lopartialkey,locaseinsensitive]);
if tbMaskCodMask.value=2 then
tbContatoContato.EditMask := tbMaskMask.Value;
tbContatoContato.Value := tbcontatocontato.Value;
showmessage(tbcontatocontato.Value);
(tbmaskmask.Value,tbContatoContato.Value);
tbContatoContato.Value := FormatMaskText(tbMaskMask.Value,tbContatoContato.Value);
tbContato.post;
tbcontato.Next;
Com esse seu código, você está alternado o conteúdo do campo Contato para um conteúdo já com a máscara, e se o usuário for alterar o campo o edit virá com os pontos e não haverá na verdade uma máscara e sim um campo aberto com pontos no meio, podendo alterar livremente.
Além do mais, você terá que rodar esse seu loop de vez em quando para manter os campos com a formatação... está muito estranho isso.
Minha sugestão continua a mesma, inclusive você usou ela no seu código:
Só que do meu modo, o conteúdo do campo contato continuará limpo, apenas aparecerá a mascara nos grids e nos edits, pois a cada registro que você navegar a rotina AfterScroll rodará ajustando o EditMask do campo Contato. Mas para isso as tabelas precisam estar relacionadas entre si, ou seja, em cada registro da tabela tbContato haverá um CodMascara que estará relacionado à tabela tbMascara por sua chave CodMascara.
Usando IBX, seu select para o IBDataSet para a tabela tbContato deverá ser algo mais ou menos assim:
select * from Contatos where CodMascara = :CodMascara
ligando a propriedade DataSource desse dataset a um DataSource ligado ao DataSet da tabela Mascara. Xiii, meio enrolado... claro, não sei nem qual o seu banco de dados!!!
Tenho uma situação num sistema que é mais ou menos igual a este seu caso e funciona. Existem várias tabelas de procedimentos médicos com diversos códigos, porém em cada tabela a formatação dos códigos é diferente.
AMB / consulta / 00.01.001-4
CBHPM / consulta / 1.01.01.01-4
SUS / insuf.cardíaca / 77.500.11-3
Os códigos acima são armazenados assim:
00010014 - consulta
10101014 - consulta
77500113 - insuf.cardíaca
Em cada tabela as máscaras são armazenadas no campo MascCod assim:
99.99.999-9
9.99.99.99-9
99.999.99-9
Conforme o usuário consulta uma tabela diferente a máscara do campo Tabela do dataset ValCod é alterada usando o código abaixo no AfterScroll do dataset de tbTab: