ACC: Como limitar o número de caracteres para tamanho da caixa de texto

Traduções de Artigos Traduções de Artigos
Artigo: 152475 - Ver produtos para os quais este artigo se aplica.
Avançado: Requer conhecimentos avançados sobre codificação, interoperabilidade e multi-utilizador.

Para obter uma versão de Microsoft Access 2002 deste artigo, consulte 324584.
Para obter uma versão de Microsoft Access 2000 deste artigo, consulte 198649.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo mostra como limitar a quantidade de texto escrito numa caixa de texto para que a largura do texto não exceda a largura da caixa de texto.

Este artigo pressupõe que está familiarizado com o Visual Basic for Applications e criação de aplicações do Microsoft Access utilizando as ferramentas de programação fornecidas com o Microsoft Access. Para mais informações sobre o Visual Basic for Applications, consulte a versão do manual "Criar aplicações com o Microsoft Access".

NOTA: Visual Basic for Applications é designado por Basic do Access no Microsoft Access versão 2.0. Para mais informações sobre o Basic do Access, consulte o manual "Building Applications".

NOTA: Este artigo explica uma técnica demonstrada nos ficheiros de exemplo, FrmSampl.exe (para o Microsoft Access para Windows 95 versão 7.0) e FrmSmp97.exe (para o Microsoft Access 97). Para obter informações sobre como obter estes ficheiros de exemplo, consulte os seguintes artigos na base de dados de conhecimento da Microsoft:
150895ACC95: Exemplo do Microsoft Access formulários disponível no Centro de transferências

175066ACC97: Microsoft Access 97 formulários de exemplo disponível no Centro de transferências

Mais Informação

As informações seguintes incluem um procedimento Visual Basic for Applications, LimitTextToControlWidth, que pode ser chamado a partir do evento PremirATecla de uma caixa de texto para limitar a quantidade de texto introduzido para que a soma da largura de todos os caracteres no texto não exceda a largura da caixa de texto.

Este procedimento é ideal para os programadores que pretendam utilizar um não - tipo de letra proporcionalmente espaçada para imprimir o texto para uma localização fixa num anterior ao imprimir o formulário. O procedimento LimitTextToControlWidth garante que um utilizador não conseguir escrever mais texto não cabe na área de definido o formulário.

Existem vários factores que afectam a largura do texto. Quanto maior for o tipo de letra tamanho, menos os caracteres que será possível escrever. A selecção do tipo de letra também afecta a largura dos caracteres no texto. Caracteres num tipo de letra não proporcionalmente espaçado, tal como Arial ou Times New Roman, têm larguras diferentes. A letra "i" é mais estreita de largura que a letra "X". Além disso, para o mesmo tamanho de tipo de letra, a letra "i" de um tipo de letra pode de ter uma largura diferente em outro tipo de letra. "I" no tipo de letra Arial é muito mais estreito do que o "i" no tipo de letra Courier New.

Os seguintes passos fornecem versões de 16 bits e 32 bits do procedimento, seguido de um exemplo de como aplicar o procedimento a controlos num formulário.

NOTA: O código seguinte utiliza a função API da programação de aplicação GetTextExtentPoint Windows. Só é possível chamar esta função da API do controlo tem foco num formulário do Microsoft Access.

Código - Microsoft Access 97 e o Microsoft Access 7.0 de 32 bits

  1. Crie um novo módulo e escreva o seguinte na secção Declarations:
          Option Explicit
    
          Const LOGPIXELSX = 88
          Const LOGPIXELSY = 90
          Const TWIPSPERINCH = 1440
    
          Type Size
             cx As Long
             cy As Long
          End Type
    
          Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
          Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, _
             ByVal nIndex As Long) As Long
          Declare Function GetFocus Lib "user32" () As Long
          Declare Function GetTextExtentPoint Lib "gdi32" Alias _
             "GetTextExtentPointA" (ByVal hDC As Long, ByVal lpsz As String, _
             ByVal cbString As Long, lpSIZE As Size) As Long
          Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, _
             ByVal hDC As Long) As Long
    						
  2. Escreva os seguintes procedimentos:
          Sub ConvertPixelsToTwips(X As Long, Y As Long)
             Dim hDC As Long, hWnd As Long, RetVal As Long
             Dim XPIXELSPERINCH As Long, YPIXELSPERINCH As Long
    
             '' Retrieve the current number of pixels per inch, which is
             '' resolution-dependent.
             hDC = GetDC(0)
             XPIXELSPERINCH = GetDeviceCaps(hDC, LOGPIXELSX)
             YPIXELSPERINCH = GetDeviceCaps(hDC, LOGPIXELSY)
             RetVal = ReleaseDC(0, hDC)
    
             '' Compute and return the measurements in twips.
             X = (X / XPIXELSPERINCH) * TWIPSPERINCH
             Y = (Y / YPIXELSPERINCH) * TWIPSPERINCH
          End Sub
    
          Sub LimitTextToControlWidth(KeyAscii As Integer)
             Dim AC As Control
             Dim Txt As String
             Dim TxtWidth As Long, SpaceWidth As Long
             Dim hWnd As Long, hDC As Long
             Dim lpSIZE As Size
             Dim RetVal As Long
    
             '' Exit if a non-printable character is typed.
             If KeyAscii < 32 Then Exit Sub
    
             '' Record active control.
             Set AC = Screen.ActiveControl
    
             '' Get the control text.
             Txt = AC.Text & ""
    
             '' Append typed character into the text.
             If KeyAscii > 32 Then
                Txt = Left(Txt, AC.SelStart)
                Txt = Txt & Chr$(KeyAscii)
                Txt = Txt & Mid(Txt, AC.SelStart + 1 + AC.SelLength)
             End If
    
             hWnd = GetFocus()
             hDC = GetDC(hWnd)
    
             '' Compute the width of the text.
             RetVal = GetTextExtentPoint(hDC, Txt, Len(Txt), lpSIZE)
             ConvertPixelsToTwips lpSIZE.cx, lpSIZE.cy
             TxtWidth = lpSIZE.cx
    
             '' Compute width of a space.
             RetVal = GetTextExtentPoint(hDC, " ", 1, lpSIZE)
             ConvertPixelsToTwips lpSIZE.cx, lpSIZE.cy
             SpaceWidth = lpSIZE.cx
    
             '' Are there trailing spaces to contend with?
             If AC.SelStart + 1 > Len(Txt) Then
                '' Add number of spaces * SpaceWidth to width of string.
                TxtWidth = TxtWidth + ((AC.SelStart + 1 - Len(Txt)) *  _
                   SpaceWidth)
             End If
    
             If TxtWidth + (SpaceWidth / 2) > AC.Width Then
                Beep
                KeyAscii = 0
             End If
    
          End Sub
    						

Código de 16 bits - Microsoft Access 2.0

NOTA: No código de exemplo seguinte, um sublinhado (_) no final de uma linha é utilizado como um carácter de continuação de linha. Remova o carácter de sublinhado do final da linha quando recriar este código Basic do Access,

  1. Crie um novo módulo e escreva o seguinte na secção Declarations:
          Option Explicit
    
          Const LOGPIXELSX = 88
          Const LOGPIXELSY = 90
          Const TWIPSPERINCH = 1440
    
          Type SIZE
             cx As Integer
             cy As Integer
          End Type
    
          Declare Function GetDC Lib "User" (ByVal hWnd As Integer) As Integer
          Declare Function GetDeviceCaps Lib "GDI" (ByVal hDC As Integer, _
             ByVal nIndex As Integer) As Integer
          Declare Function GetTextExtentPoint Lib "GDI" (ByVal hDC As _
               Integer, ByVal lpszString As String, ByVal cbString As _
               Integer, lpSIZE As SIZE) As Integer
          Declare Function GetFocus Lib "User" () As Integer
          Declare Function ReleaseDC Lib "User" (ByVal hWnd As Integer, _
             ByVal hDC As Integer) As Integer
    						
  2. Escreva os seguintes procedimentos:
          S
          Sub LimitTextToControlWidth (KeyAscii)
             Dim AC As Control
             Dim Txt As String
             Dim TxtWidth As Integer, SpaceWidth As Integer
             Dim hWnd As Integer, hDC As Integer
             Dim lpSIZE As SIZE
             Dim RetVal As Integer
    
             '' Exit if a non-printable character is typed.
             If KeyAscii < 32 Then Exit Sub
    
             '' Record active control.
             Set AC = Screen.ActiveControl
    
             '' Get the control text.
             Txt = AC.Text & ""
    
             '' Append typed character into the text.
             If KeyAscii > 32 Then
                Txt = Left(Txt, AC.SelStart)
                Txt = Txt & Chr$(KeyAscii)
                Txt = Txt & Mid(Txt, AC.SelStart + 1 + AC.SelLength)
             End If
    
             hWnd = GetFocus()
             hDC = GetDC(hWnd)
    
             '' Compute the width of the text.
             RetVal = GetTextExtentPoint(hDC, Txt, Len(Txt), lpSIZE)
             ConvertPixelsToTwips lpSIZE.cx, lpSIZE.cy
             TxtWidth = lpSIZE.cx
    
             '' Compute width of a space.
             RetVal = GetTextExtentPoint(hDC, " ", 1, lpSIZE)
             ConvertPixelsToTwips lpSIZE.cx, lpSIZE.cy
             SpaceWidth = lpSIZE.cx
    
             '' Are there trailing spaces to contend with?
             If AC.SelStart + 1 > Len(Txt) Then
                '' Add number of spaces * SpaceWidth to width of string.
                TxtWidth = TxtWidth + ((AC.SelStart + 1 - Len(Txt)) * _
                   SpaceWidth)
             End If
    
             If TxtWidth + (SpaceWidth / 2) > AC.Width Then
                Beep
                KeyAscii = 0
             End If
    
          End Sub
    
          Sub ConvertPixelsToTwips (X As Integer, Y As Integer)
             Dim hDC As Integer, hWnd As Integer, RetVal As Integer
             Dim XPIXELSPERINCH As Integer, YPIXELSPERINCH As Integer
    
             '' Retrieve the current number of pixels per inch, which is
             '' resolution-dependent.
             hDC = GetDC(0)
             XPIXELSPERINCH = GetDeviceCaps(hDC, LOGPIXELSX)
             YPIXELSPERINCH = GetDeviceCaps(hDC, LOGPIXELSY)
             RetVal = ReleaseDC(0, hDC)
    
             '' Compute and return the measurements in twips.
             X = (X / XPIXELSPERINCH) * TWIPSPERINCH
             Y = (Y / YPIXELSPERINCH) * TWIPSPERINCH
          End Sub
    						

Como utilizar o procedimento LimitTextToControlWidth

  1. Crie um novo formulário em branco não baseado em qualquer tabela ou consulta.
  2. Coloque 3 caixas de texto no formulário com as seguintes propriedades:
    Nome: um
    Para a esquerda: 1 "
    Início:. 5 "
    Largura: 1 "
    Altura: 0.1667 "
    NomeDoTipoDeLetra: Arial
    TamanhoDoTipoDeLetra: 12

    Nome: dois
    Para a esquerda: 1 "
    Início: 1 "
    Largura: 1 "
    Altura: 0.1667 "
    NomeDoTipoDeLetra: Arial
    TamanhoDoTipoDeLetra: 8

    Nome: três
    Para a esquerda: 1 "
    Início: 1,5 "
    Largura: 1 "
    Altura: 0.3743 "
    NomeDoTipoDeLetra: Arial
    TamanhoDoTipoDeLetra: 24
  3. Chamar o procedimento LimitTextToControlWidth a partir do evento PremirATecla de cada caixa de texto acima, por exemplo:
          Sub One_KeyPress(KeyAscii As Integer)
             LimitTextToControlWidth KeyAscii
          End Sub
    						
  4. Visualizar o formulário e tente escrevendo o texto seguinte em cada caixa de texto:
    Este é um teste o sistema de difusão de emergência
    Note que o resultado aparece da seguinte forma:
          Text box     Text allowed to type
          ---------------------------------
          One          This is a test
          Two          This is a test of the
          Three        This is

Propriedades

Artigo: 152475 - Última revisão: 19 de janeiro de 2007 - Revisão: 2.3
A informação contida neste artigo aplica-se a:
  • Microsoft Access 2.0 Standard Edition
  • Microsoft Access 95 Standard Edition
  • Microsoft Access 97 Standard Edition
Palavras-chave: 
kbmt kbhowto kbprogramming kbusage KB152475 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 152475
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com