Alterar a cor dos campos quando receberem o foco
Nota importante: para ter acesso aos vídeos e arquivos exemplos deste site, adquira um dos planos apresentados abaixo. Você pode comprar em até 5x no Cartão de Crédito, através do Paypal.
Veja como comprar e saiba mais sobre o material oferecido, clicando aqui.
Não faz muito tempo em que eu fazia uso de uma função para alterar a cor de fundo dos campos dos formulários, com o objetivo de destacá-los, na medida em que recebessem o foco. Para que um campo do formulário recebesse o foco, usava uma função para destacá-lo na cor desejada, no caso, a amarela e acionava novamente a função para restaurar a cor de fundo original, no caso, a cor branca, quando o campo perdesse o foco. O problema era que eu tinha que escrever a função nos eventos Ao receber foco e Ao perder foco de cada um dos campos. Se o formulário tivesse 30 campos era uma verdadeira canseira ter que digitar as funções.
Veja na imagem, as funções escritas direto na lista de eventos:
Essa digitação consumia um tempo precioso e me sentia super incomodado com esta tarefa repetitiva. Resolvi partir para o enfrentamento e pesquisar uma solução. Assim sendo, aprendi que podemos escrever as funções nos eventos, direto pelo código.
Criei as funções em um módulo global para que pudesse aproveitá-las em qualquer formulário que necessitasse. Acompanhe com atenção os comentários, nas funções abaixo:
Faça o login aqui para ter acesso ao código.
No evento Ao carregar do formulário, basta chamar pela função fncMontaEventos() que o trabalho árduo de digitar as funções nos eventos será realizado.
Private Sub Form_Load() Call fncMontaEventos(Me) End Sub
Era tudo que eu queria, pois passei a ganhar um tempo enorme pelo fato de não ter que abrir campo por campo para digitar o nome da função.
Observe na imagem abaixo, o formulário exemplo que você receberá:
Como selecionar uma cor no Access 2007/2010 e configurar a função RGB(x,y,z) ?
Selecione a lista de propriedades de um campo qualquer e na propriedade cor do fundo, clique nas reticências [...]. Em seguida, clique no botão Mais Cores. Veja na imagem:
Clique na guia Personalizar > Selecione o tom de cor no quadro > Com o botão deslizante, ajuste a intensidade > Ao chegar na intensidade desejada, anote os valores do RGB. Veja na imagem abaixo:
Conheça a função Switch()
É uma função do Access pouco utilizada, mas muito interessante para o nosso caso. O que ela faz é retornar um valor correspondente, diante de uma opção válida. Para o nosso caso, o argumento Cor está sendo utilizado para definir o valor a ser retornado.
Se Cor = 0 retorna ao valor RBG(255,255,255), que corresponde a cor branca.
Se Cor = 1 retorna ao valor RGB(255,253,185), que corresponde a cor amarela.
Se você quiser incrementar mais uma cor, por exemplo, a azul, a função ficará assim:
Faça o login aqui para ter acesso ao código.
No caso da opção Cor = 2, teremos o seguinte resultado, ao executar o código:
Forms(NomeForm)(NomeControle).BackColor = RGB(236, 240, 254) 'Azul claro
A propriedade SelStart
Com esta propriedade podemos determinar a posição do ponteiro no campo. Neste nosso caso queremos que o ponteiro se posicione sempre no final do texto, assim que campo receber o foco.
A função Len() retorna o comprimento do texto. Por exemplo: len("Avelino") retorna 7.
O resultado para o código, seria esse abaixo, para o texto "Avelino":
If Cor = 1 Then Forms(NomeForm)(NomeControle).SelStart = 7
Baixe o arquivo exemplo
Desafios com este arquivo exemplo.
1) Tente implementar a possibilidade de escolher outras cores, além da amarela. Acrescente a possibilidade de se optar pela azul, por exemplo.
Dica: deverá criar um argumento na função fncMontaEventos(). Exemplo:
Public Function fncMontaEventos(frm As Form, cor as byte)
2) Além da cor do fundo, altere o código para tornar a cor da fonte vermelha quando o campo receber o foco.
Dica: A propriedade ForeColor , altera a cor da fonte.
3) Acrescente um controle Combobox ao formulário e altere o código para quando este receber o foco, ficar com o fundo verde.
Um bom treino e sucesso!
Os dez artigos mais visitados
MontaRibbons v.7.0 - Assistente completo para criar ribbons no Access
Vídeo - Controle personalizado de Acesso de Usuários
Vídeo - Aprenda sobre filtragens
Vídeo - Segurança máxima, usando o OPEN
Uma ajuda para quem está começando um negócio ou um projeto
Integrando o Access com Servidor MySQL - Introdução
Desabilitando a faixa(ribbon) superior do Access
Vídeo - Programação de relatórios - Parte 1
Como carregar o seu menu sem que ele vá para lista de suplementos
Adquira o kit UsandoAccess e aprenda em alta velocidade
63 comentários Alexnilto Sousa 30/08/2024 07:13:27 Prezado Avelino. Pode me orientar por favor? O módulo funciona perfeitamente em alguns formulários. Porém copiei um formulário de um outro projeito e quando implementei no projeto onde está o módulo ele deu erro e pediu para depurar apresentando o seguinte erro: If cor = 1 Then ctl.SelStart = Len(ctl.Value & ""), ficando em amarelo a partir de ctl.SelStart. Como resolver isso? Desde já fico muito grato. Leandro Barbosa 24/01/2023 08:56:28 Quem se esforçar na aplicação poderá ampliar e muito seu horizonte de programação com esse tutorial. Já apliquei umas quatro variações desta função, abaixo uma que construí para ordenar dados de um formulário ao clicar no rótulo do campo: Public Function fncAscDesc(frm As Form) 'Função para ordenar crescente ou decrescente Dim ctl As Control For Each ctl In frm.Controls Select Case ctl.ControlType Case acLabel, acTextBox ctl.OnClick = "=AscDesc([" & ctl.Name & "])" End Select Next End Function Public Function AscDesc(rtl As Label) Dim strCampo As String If Left(rtl.Name, 3) = "rtl" And rtl.Tag = 0 Then strCampo = Right(rtl.Name, Len(rtl.Name) - 3) & " ASC" DoCmd.SetOrderBy strCampo rtl.Tag = 1 Else If Left(rtl.Name, 3) = "rtl" And rtl.Tag = 1 Then strCampo = Right(rtl.Name, Len(rtl.Name) - 3) & " DESC" DoCmd.SetOrderBy strCampo rtl.Tag = 0 End If End If End Function Muito obrigado Avelino! Carlos Gomes 15/01/2023 07:21:37 Gostaria de saber como fazer isso no EXCEL (pintar o campo que estiver selecionado, depois voltar ao normal ou mudar para outro campo) - Meu whats (67) 9.9235-6633 Carlos 15/01/2023 07:20:49 Gostaria de saber como fazer isso no EXCEL (pintar o campo que estiver selecionado, depois voltar ao normal ou mudar para outro campo) Carlos 16/09/2022 14:00:28 Muito bom. Mas tenho um problema agora. O evento ao receber o foco nos campos dos formulários não funciona. Rodnei Calcagnotto 08/09/2022 14:57:30 Eu não tenho mais dúvidas! Avelino Sampaio precisa ser canonizado! Obrigado, mestre! RipadorBR 28/06/2022 18:39:03 Boaaaaa, já implementei, ótimo tutorial. Abraço. Avelino Sampaio 28/06/2022 12:07:59 RipadorBR, veja este meu artigo que ensina como elaborar um formulário padrão: http://www.usandoaccess.com.br/tutoriais/padronizando-formularios-e-relatorios-no-microsoft-access.asp?id=1#inicio Bom estudo! RipadorBR 27/06/2022 15:26:20 Boa Tarde Avelino, Ainda não consegui fazer este módulo pintar o fundo dos Cabeçalhos e Rodapés dos formulários. Como seria o mais prático a fazer para não ter que fazer a operação em cada formulário? Grato. Hephraim BF 24/04/2022 10:28:00 Obrigado Avelino pela ajuda. Funcionou de acordo com sua proposta, no entanto, como faço a chamada em vários forms então fica trabalhoso passar o valor da variável vIntFormNome individualmente. Pois na adaptação que te passei esse valor era passado de acordo com o argumento da função fncMontaEventos. Avelino Sampaio 23/04/2022 07:03:17 Hephraim testei com a seguinte linha e funcionou para mim. Forms("subFormTeste")!Rótulo4.Caption = ctl.StatusBarText Eu estou entendendo que o seu rótulo "rotStatus" esteja no formulário principal e não no subformulário. Vc então tem que indicar o formulário principal na variável vintFormName vIntFormNome = "NomeDoFormulárioPrincipal" Sucesso! Hephraim BF 22/04/2022 09:18:50 Dim vIntFormNome As String Public Function fncMontaEventos(frm As Form) Dim ctl As control vIntFormNome = frm.Name For Each ctl In frm.Controls Select Case ctl.ControlType Case acTextBox, acComboBox, acListBox If ctl.OnGotFocus = vbNullString Then ctl.OnGotFocus = "=fncPintaCampo([" & ctl.Name & "],1)" End If If ctl.OnLostFocus = vbNullString Then ctl.OnLostFocus = "=fncPintaCampo([" & ctl.Name & "],0)" End Select Next End Function Public Function fncPintaCampo(ctl As control, Cor As Byte) On Error Resume Next ctl.BackColor = Switch(Cor = 0, RGB(255, 255, 255), Cor = 1, RGB(255, 253, 185)) Forms(vIntFormNome)!rotStatus.Caption = ctl.StatusBarText End Function Avelino Sampaio 22/04/2022 06:28:16 Hephraim, mostre a função usada para a barra de status. No aguardo Hephraim BF 21/04/2022 14:38:45 A função funciona perfeitamente e incrementei uma parte que por não usar a barra de status do access utilizo uma barra própria que o texto é exibido por essa função. No entanto, quando se trata de um subformulário o campo é pintado, porém, o texto não é exibido no status. Alexandre Alves 08/01/2022 08:24:09 Bom dia Uso uma função para pintar um campo, mas quando fecho o formulário e abro novamente ele não está pintado, o que devo fazer? Grato. Marcus Vinicius Salles 19/12/2021 12:06:05 Realmente realçar os campos em foco ajuda a leitura pelos usuários, parabéns, a solução é bastante simples e elegante. Gostaria de contribuir co a sugestão abaixo: If Cor = 1 Then varCorAnterior = ctl.BackColor ctl.BackColor = Switch(Cor = 0, varCorAnterior, Cor = 1, RGB(255, 253, 185)) Deste modo, ao receber o foco, a Cor original do Controle é salva e restaurada no evento LostFocus. No meu caso é interessante pois, para os campos obrigatórios no Form, eu pinto o fundo identificando-os para o Usuário. mvsbh2005@hotmail.com Henrique Leal 21/11/2021 09:19:40 Bom dia! Show de bola Avelino! Deu certo, Obrigado! Avelino, sou iniciante no Access e me confundo todo com em como escrever essas funções, principalmente no que diz respeito á "Len", "Dir", etc. ou onde usar "aspas" ou "virgulas" como no exemplo: "=fncPintaCampo([" & ctl.Name & "],1)", é sempre dificil para o iniciante saber quando concatenar igual o exemplo, onde colocar o igual e etc. Não sei se você tem algum artigo sobre isso, o pesquisador de objetos tira muitas duvidas mas esses paramêtros um iniciante como eu pena para aprender. Com certeza ajudaria muitos iniciantes. Um grande abraço! Avelino Sampaio 14/11/2021 04:44:50 Henrique, Altere o código para desviar da combo especifica. Exemplo: Case acTextBox, acComboBox, acListBox if ctl.name <> "NomeDaSuaCombobox" then ctl.OnGotFocus = "=fncPintaCampo([" & ctl.Name & "],1)" E lá no evento "Ao receber foco" da sua combobox, acrescente a função fncPintaCampo() Private Sub NomeComboBox_GotFocus() call fncPintaCampo(me!NomeDaComboBox,1) Seu código aqui End Sub Sucesso! Henrique Leal 13/11/2021 11:59:18 Bom dia mestre Avelino. Perfeito esse código! Como faço para deixar um combobox de fora do código? Pois tenho um combo de pesquisa que contem uma instrução Sql ao receber foco e após atualizar, e quando testei o código pinta eventos essas instruções são ignoradas, o que prejudica o funcionamento da pesquisa. Muito Obrigado. Abraços Welson Zeferino de Oliveira Junior 09/11/2021 14:41:24 Realmente e sem nenhuma dúvida todo o trabalho que o Avelino divulga em seu site é de uma riqueza sem igual. Quem gostaria de participar do curso de vba com esse gigante? Lança aí Avelino, estamos aguardando! Johnny Cardoso 09/11/2021 09:16:20 O que era bom, ficou melhor ainda. Se agregar as implementações do Marcelo - Joinville-SC, fecha o pacote. roni lupe 09/11/2021 08:16:13 As atualizações no arquivo exemplo são realmente significativas, quem já baixou o primeiro exemplo, recomendo que baixem também este novo arquivo. Obrigado Avelino! MARCIO MELO - RJ 08/11/2021 22:31:10 Eu primeiro adquiri o MontaRibbos v2.0 e já estou na v4.0, depois adquiri as Coletâneas bem no início, tenho que confirmar que realmente obtive muitos resultados positivos que podem ser comprovados na ajuda online de um dos programa q fiz utilizando o Maestro como pontapé inicial junto com o monta Ribbons, segue o link http://sic.iniciantejoomla.com/ observem no vídeo de introdução que tem muitas da funções das coletâneas, só tenho a agradecer... Moro no RJ e ainda não conheço pessoalmente o mestre Avelino, será uma honra... Sou mais Brasil! roni lupe 08/11/2021 10:03:36 Concordo com o Johnny, eu adquiri a coletânea do site Usando Access e já aprendi muito com os conteúdos riquíssimos da coletânea e ainda não estudei nem 30% dos conteúdos. Apesar de serem sempre muito baratos os pacotes do site, eu estou me programando para adquirir a video-aula de técnicas de invasão para aprimorar técnicas de defesa. A programação esta por conta de atingir 90% do desenvolvimento de um sistema que acredito que terá grande potencial de comercialização, sendo assim, precisarei conhecer as técnicas de defesas que o Avelino conhece. Enfim, acretido que ainda esse mês irei comprar essa video-aula, pois, tenho certeza que será mais um ótimo investimento profissional. Recomendo a todos! Johnny Cardoso 08/11/2021 09:00:04 A todos os amantes e estudiosos do Access. Apenas quero registrar o quão rentável se tornou o investimento que fiz ao adquirir os produtos do Avelino. USANDOACCESS se tornou minha referência, proporcionando um trabalho com harmonia e eficiência sem igual. Recomendo pois, além de todo o conteúdo excelente, ainda podemos contar com as soluções postadas e por e.mail do Avelino. Esse é o "CARA". Abração Avelino...SUCESSO, sempre ! Avelino Sampaio 08/11/2021 05:30:23 Robson Rampinelli, fiz de propósito, como parte do desafio proposto no artigo. Veja a seguinte linha: Case acTextBox ', acComboBox, acListBox Observe que coloquei um apóstrofe ('), desabilitando os tipos de controle Combobox (acComboBox) e ListBox (acListaBox). Basta tirar o apóstrole que esses tipos de controles serão afetados. Case acTextBox, acComboBox, acListBox Sucesso! Marcelo David 08/11/2021 01:13:09 Muito bom artigo! Como sempre está de parabéns! Robson Rampinelli 07/11/2021 22:40:15 Avelino, boa noite! É sempre bom saber que tem pessoas como vc, que compartilha teus conhecimentos com os demais. Atribui o teu código no meu sistema e funcionou nos campos normais, porem em alguns formulários tenho caixas de combinação (combobox), nesse caso, não funcionou.. Mesmo assim, muito obrigado pela contribuição. Abraço! Avelino Sampaio 07/11/2021 18:06:35 Paulo Renato Neves Pinto , entre em contato pelo email abaixo pois tenho uma material bem legal para lhe oferecer. avelino(arroba)usandoaccess(ponto)com(ponto)br No aguardo Avelino Sampaio 07/11/2021 18:04:29 Marcelo - Joinville-SC, Obrigado pela sua super contribuição. Sucesso! Avelino Sampaio 07/11/2021 18:00:21 Wagner Cattani, testei seu procedimento no Access 2007 e funciionou direitinho. Fico muito agradecido por vc ter trazido esta excelente dica aqui para o artigo. Sucesso! Avelino Sampaio 07/11/2021 17:57:25 Roni Lupe, altere a propriedade SelStart para zero. ... ... '------------------------------------------------------ 'Ao receber o foco posiciona o cursor no final do texto '------------------------------------------------------ If Cor = 1 Then Forms(NomeForm)(NomeControle).SelStart =0 Sucesso! roni lupe 07/11/2021 17:47:15 Olá Avelino! Já passei horas, durente dias, pesquisando na internet por um código com essa função. Enfim, encontrei. Só tenho uma duvida. Como faço para que o ponteiro se posicione no início do texto? Obrigado! Avelino Sampaio 07/11/2021 17:21:20 João Bola, Veja as alterações para o seu caso: Public Function fncMontaEventos(frm As Form) Dim ctl As Control For Each ctl In frm.Controls Select Case ctl.ControlType Case acTextBox , acComboBox, acListBox If ctl.OnMouseMove = vbNullString Then ctl.OnMouseMove = "=fncPintaCampo('" & frm.Name & "','" & ctl.Name & "',1)" 'Cor Amarela End Select Next If frm.Detalhe.OnMouseMove = vbNullString Then frm.Detalhe.OnMouseMove = "=fncPintaCampo('" & frm.Name & "','limpa',0)" 'Cor Branca End Function Public Function fncPintaCampo(NomeForm As String, NomeControle As String, Cor As Byte) Static campoatual As String If NomeControle = "limpa" Then NomeControle = campoatual Else campoatual = NomeControle End If Forms(NomeForm)(NomeControle).BackColor = Switch(Cor = 0, RGB(255, 255, 255), Cor = 1, RGB(255, 253, 185)) End Function Sucesso! Johnny Cardoso 07/11/2021 16:04:58 Wagner Cattani, sua técnica não funcionou? James Resplandes 07/11/2021 15:32:03 Cara, você é mágico! Marcelo - Joinville-SC 07/11/2021 13:22:03 Aceitei o Desafio.... Fiz uma agregação ao excelente cód. do Mod do Avelino........ veja abaixo meu complemento......caso alguém se interesse.... Copiar o texto abaixo substituindo do módulo criado pelo Avelino..... '*********************************************** Option Compare Database Public Function fncMontaEventos(frm As Form) Dim ctl As Control For Each ctl In frm.Controls Select Case ctl.ControlType Case acTextBox , acComboBox, acListBox ctl.OnGotFocus = "=fncPintaCampo([" & ctl.Name & "],1)" 'Cor Amarela ctl.OnLostFocus = "=fncPintaCampo([" & ctl.Name & "],0)" 'Cor Branca End Select Next End Function Public Function fncPintaCampo(ctl as control, Cor As Byte) ctl.BackColor = Switch(Cor = 0, RGB(255, 255, 255), Cor = 1, RGB(255, 255, 137)) ctl.ForeColor = Switch(Cor = 0, 2631720, Cor = 1, vbBlue) ctl.FontWeight = Switch(Cor = 0, 0, Cor = 1, 700) ctl.BorderColor = Switch(Cor = 0, 12040119, Cor = 1, vbRed) If Cor = 1 Then ctl.SelStart = Len(ctl.value & "") End Function Wagner Cattani 07/11/2021 13:09:24 Muito bom mesmo o código, já escrevi códigos para alterar cor do preenchimento por muito tempo, até que um dia descobri algo muito interessante, muito interessante mesmo: Abra o formulário no modo design, selecione todos os campos que você deseja mudar a cor de fundo ao ter o foco, vá na parte de formatação de texto e selecione a Cor de Plano de Fundo que deseja que os campos selecionados tenham ao ter o foco (amarelo por exemplo), logo em seguida ainda com os campos selecionados abra novamente a Cor de Plano de Fundo e selecione "Transparente" e PRONTO!!! Agora basta percorrer os campos para ver o resultado. :D MARCIO MELO - RJ 07/11/2021 12:50:45 Melhor coisa no meu e-mail é quando recebo (Usando Access - Newsletter xx) suas aulas..., eu utilizo muito dessa tática de receber foco destacar a cor de fundo e ao perder foco deixa a cor igual ao do fundo do form(Detalhe), as vezes deixo essa "árdua missão"para quando estou c paciência de copiar/colar rsrs. Sua solução como sempre super completa, didática e profissional obrigado mais uma fez por essa colaboração, o capricho de deixar o curso no final do texto que existir é espetacular, nunca tinha utilizado, sem palavras... adoro automatizar tudo ao máximo que puder... Sou mais Brasil!!! Paulo Renato Neves Pinto 07/11/2021 11:49:03 Programei em Basic, Cobol e por último em Clipper por muito tempo, mas no access tenho desenvolvido sistemas simples no modo visual, encontrei as facilidades de melhorar a aparência porém esbarro sempre nos códigos. Você acabou de me enviar uma ótima dica; gostaria de verdade resolver este meu em desenvolver formulas e outras funções de códigos no assess. Caso tenhas uma apostila, livros para isto se possível for gostaria de adquirir, desde que também não seja muito caro. joão bola 07/11/2021 09:48:05 ótimo tuto parabens. só uma dúvida, como eu posso fazer o efeito de pintar um controle ao passar o mouse em cima e voltar ao normal quando o mouse sair de cima dele sem ter que usar o evento ao passar o mouse de todos eles para pintar e sem ter que usar o ao passar o mouse do form para voltar ao normal pois isso faz com que tenho que usar um for next no form para pintar todos os controles da cor original? agradeso de antemao abrassos Paulo Sergio de Freitas Junior 22/10/2021 16:29:55 Galera, preciso de uma ajuda, tenho vários campos que quando perdem o foco executam uma ação, mas quando adiciono esse procedimento meus campos não executam mais as tarefas que criei, como faço para manter as minhas tarefas e também mudar de cor quando receber e perder foco? Obrigado kadhu 05/10/2021 23:20:58 boa noite ,consegui implementar o cod no meu aplicativo ,porém gostaria de trocar o amarelo ,por outra cor ,como eu faria ?obrigado Ednei Soares 03/10/2021 13:27:13 Avelino, boa tarde. É possível colorir os campos de um subformulário em modo "Folha de Dados"?? Alterei o subFormTeste do PintaCampoFoco para o modo Folha de Dados mas a função não coloriu os campos. Grato, Damasceno 15/08/2021 15:58:55 Prezado Prof. Avelino. Funcionou muito bem obrigado pela dica. Marcelo Costa 30/07/2021 09:32:08 Obrigado professor. Vou tentar colocar em prática e posto aqui o resultado. Grande abraço. Avelino Sampaio 30/07/2021 08:20:44 Marcelo, use a formatação condicional. Copie e cole no seu navegador o endereço abaixo, do meu artigo: http://www.usandoaccess.com.br/dicas/dica5_1.asp Bom estudo! Marcelo Costa 28/07/2021 14:56:36 Boa tarde! Tento resolver algo parecido: Tenho que confeccionar crachás com uma "barra" de cor diferente para funcionários de acordo com o setor de trabalho. Já tenho o modelo do crachá, porém gostaria de saber como fazer para o BD inserir a cor desejada partindo de um comando (como selecionar, por exemplo). Sugestão??? Desde já obrigado. Zilton Alencar 11/06/2021 10:13:18 Avelino, como aplicar estas funções a uma caixa de listagem? Meu caso é o seguinte: em uma lista de Clientes, aquele que estiver desabilitado para compras aparece na listagem, mas com uma cor diferente. VlW! Avelino Sampaio 20/04/2021 18:12:01 Silva, observe os comentários do senhor João Bola, que tem a solução para o uso do mouse. Sucesso! Silva 20/04/2021 15:46:42 Olá, funciona muito bem o exemplo mas se fosse para alterar a fonte de um botão de comando ao mover o mouse? Leandro Barbosa 27/03/2021 10:54:29 Avelino, você está fazendo um bom trabalho. Tenho conseguido, Graças a Deus, adaptar suas funções para minhas necessidades. Dessa vez consegui alterar o nome da fonte de um determinado rótulo dos meus formulários. Veja como ficou: Public Function Rtl(frm As Form) 'Função adapatada por Leandro Barbosa 'Tendo como base a função demonstrada nesse link e criada pelo Sr. Avelino Sampaio 'http://www.usandoaccess.com.br/tutoriais/tuto53.asp?id=1#inicio 'No evento ao carregar dos formulários digite: Call Rtl(Me) Dim ctl As Control For Each ctl In frm.Controls If ctl.ControlType = acLabel And ctl.Name = "Rótulo34" Then ctl.FontName = "=CaptionRtl(" & ctl.Name & ")" End If Next End Function Public Function CaptionRtl(ctl As Control) ctl.FontName = "Verdana" End Function Avelino Sampaio 20/02/2021 06:47:19 Wellington, se eu não me engano, no exemplo que ofereci, tem uma solução para formulário Contínuo que utiliza o evento AO PINTAR. Sucesso! Wellington Silva 19/02/2021 15:00:29 Desculpa, esse foi o código: Public Function fncPintaCampo(ctl As control, cor As Byte) '-------------------------------------------- 'Altera a cor do campo que possui o foco 'Ao recebr o foco, passa para a cor Amarela 'Ao perder o foco, passa para a cor branco '-------------------------------------------- ctl.BorderColor = Switch(cor = 0, RGB(127, 127, 127), cor = 1, RGB(100, 142, 213)) '------------------------------------------------------ 'Ao receber o foco posiciona o cursor no final do texto '------------------------------------------------------ If cor = 1 Then ctl.SelStart = Len(ctl.Value & "") End Function Lembrando que no formulário contínuo fica toda a coluna "pintada" Novamente obrigado! Wellington Wellington Silva 19/02/2021 14:56:45 Grande Avelino. Em primeiro lugar, gostaria de parabenizar pelo excelente trabalho que faz. Tenho um dúvida, eu utilizei seu código e fiz uma adaptação, para que selecionasse somente a borda do campo secionado, até aí funcionou perfeitamente, porém tenho um problema. Em um relatório formulário continuo, quando seleciono o campo, fica toda a coluna selecionada, tente não utilizar esse método e ocorre o mesmo erro (inserindo Me.txtFiltro.BorderColor = RGB(100, 142, 213) - eventos receber e perder foco) . Outra coisa que notei é que quando utilizo esse código em um sub-formulário quando vlico no formulário principal o campo continua com a cor. Minha adaptação: Public Function fncPintaCampo(ctl As Control, cor As Byte) '-------------------------------------------- 'Altera a cor do campo que possui o foco 'Ao recebr o foco, passa para a cor Amarela 'Ao perder o foco, passa para a cor branco '-------------------------------------------- ctl.BackColor = Switch(cor = 0, RGB(255, 255, 255), cor = 1, RGB(255, 253, 185)) '------------------------------------------------------ 'Ao receber o foco posiciona o cursor no final do texto '------------------------------------------------------ If cor = 1 Then ctl.SelStart = Len(ctl.Value & "") End Function Novamente agradeço pelo apoio. Obrigado. Wellington Silva Filipe Bacelar 15/01/2021 12:19:27 Avelino muito interessante sua função uma vez que a mesma percorre todos os objetos do form e de mais fácil parametrização. Bem em venho feito isso através da formatação condicional pois a mesma também de dispõe de uma parâmetro ao receber foco. Abraços Leandro Barbosa 10/01/2021 09:24:33 Bom dia Avelino, obrigado pela anteção; Consegui resolver com sua ajuda e da microsoft (http://support.microsoft.com/kb/210098/pt), eu tinha definido o nome da função como "Evento", era esse erro, mudei para NaoVazio e funcionou como se deve, porém, sem o Dirty. Muito obrigado Avelino Avelino Sampaio 05/01/2021 10:45:23 leandro, insira a chamada função no evento "ao carregar" do formulário: Private Sub Form_Load() Call Evanto(Me) End Sub Sugiro que acrescente a proprieadade DIRTY(Modificado/Sujo) no código. Exemplo: Public Function Evento(frm As Form) Dim ctl As Control For Each ctl In frm.Controls Select Case ctl.ControlType Case acTextBox, acComboBox, acListBox ctl.OnExit = "=AoSair([" & ctl.Name & "],'[" & frm.Name & "]')" End Select Next End Function Public Function AoSair(ctl As Control, frm As String) If IsNull(ctl) And Forms(frm).Dirty Then MsgBox "Nulo em: " & ctl.Name DoCmd.CancelEvent End If End Function Sucesso! João Ricardo Chiodi 05/01/2021 01:05:34 Avelino, bom dia! Parabéns e um feliz ano novo a todos. No meu caso necessito que o campo esteja selecionado no momento em que ele recebe o foco (cursor), pois tenho algumas combos que estão marcadas inicialmente com a indicação "selecione" para o usuário. Leandro Barbosa 04/01/2021 12:00:47 Avelino, consegui fazer analisar campos vazios: Public Function Evento(frm As Form) Dim ctl As Control For Each ctl In frm.Controls Select Case ctl.ControlType Case acTextBox, acComboBox, acListBox ctl.OnExit = "=AoSair(" & ctl.Name & ")" End Select Next End Function Public Function AoSair(ctl As Control) If IsNull(ctl) Then MsgBox "Nulo em: " & ctl.Name DoCmd.CancelEvent End If End Function Mas não consigo fazer chamar a função, uso access 2000. Leandro Barbosa 04/01/2021 11:36:59 Avelino, excelente! Avelino, como automatizar para o caso de campos que não podem ficar nulos ou com valor igual a zero? Obrigado Reginaldo Nunes 02/01/2021 10:38:44 If cor = 1 Then ctl.SelfStart = Len(ctl.Value & "") Bom dia! Avelino Tentei adaptar o su exemplo no meu formulario mais esta dando erro na descrição acima ela fica em cor amarela porque por favor me ajude pois sou iniciante no asunto. pedro 09/08/2020 17:24:51 Gostei muito do artigo. Como faria isso num subformulario tipo folha de dados? |