Jump to content

Textbox com reticencias


CreativeJopa
 Share

Recommended Posts

Boas.

Alguém me pode explicar como ter uma textbox em que, quando o texto é maior que o tamanho da textbox, o texto é encurtado e adicionado com reticencias?

Tentei fazê-lo com o seguinte exemplo, em que calculo o tamanho da string em pixeis e comparo-o ao tamanho da textbox, mas não o acho prático, além de que, se desejar redimensionar a textbox, teria que voltar a fazer este calculo.

tamanho_artigo = System.Drawing.Graphics.FromHwnd(myHwnd).MeasureString(new_usercontrol_item_vista_mosaico.textblock_genero.Text, New System.Drawing.Font("Segoe UI", 12, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point))
                    If tamanho_artigo.Width.ToString > 150 Then
                        For i = 0 To new_usercontrol_item_vista_mosaico.textblock_genero.Text.Length - 1
                            texto_encurtado = texto_encurtado & new_usercontrol_item_vista_mosaico.textblock_genero.Text(i)
                            tamanho_artigo = System.Drawing.Graphics.FromHwnd(myHwnd).MeasureString(texto_encurtado, New System.Drawing.Font("Segoe UI", 12))
                            If tamanho_artigo.Width.ToString >= 145 Then
                                If Val(new_usercontrol_item_vista_mosaico.textblock_genero.Text.Length) - Val(texto_encurtado.Length) > 3 Then
                                    new_usercontrol_item_vista_mosaico.textblock_genero.Text = (texto_encurtado & ("..."))
                                    Exit For
                                End If
                            End If
                        Next
                    End If

O que pretendo saber, é se existe um método que seja mais prático.

Cumprimentos.

Link to comment
Share on other sites

Não que eu conheça.

Passam todos por a mesma técnica.

A menos que haja garantias que só vai usar fonts monospaced 👍

O que podes fazer é criar tu uma textbox com isso "built-in".

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

É bem fácil!

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        If TextBox1.TextLength > 19 Then ' Se o numero de caracteres da textbox for maior que 19(numero suportado), faça:
            TextBox1.Text = TextBox1.Text.Remove(19) + "..."  ' O texto da Textbox será: Seu próprio texto - caracteres depois do 19 + "..."
        End If
    End Sub
Link to comment
Share on other sites

Não é assim tão simples mateusb.

Com a tua solução, basta alterar o tamanho da textbox, o tipo de letra ou o tamanho da letra para que o teu "número suportado" deixe de fazer sentido.

Da forma que o user_unknow mostra, sabes sempre qual vai ser a área ocupada por determinada string com determinadas características de font, de forma a que possas adaptar à área da textbox.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Não é assim tão simples mateusb.

Com a tua solução, basta alterar o tamanho da textbox, o tipo de letra ou o tamanho da letra para que o teu "número suportado" deixe de fazer sentido.

Da forma que o user_unknow mostra, sabes sempre qual vai ser a área ocupada por determinada string com determinadas características de font, de forma a que possas adaptar à área da textbox.

É verdade, pois não sei de que forma ele vai usar, mas provalvelmente, deixará no padrão, caso ele mexa, é só contar quantas letras ela suporta... 😛

Link to comment
Share on other sites

E como é que "contas quantas letras ela suporta" ?

Tem de ser feito com MeasureString, para ficar alguma coisa de jeito.

Basta a fonte não ser monospaced, esta por exemplo, e abcd tem um tamanho completamente diferente de ABCD

abcd  |

ABCD  |

aBcD  |

Continuam a ser 4...

Para além disso se eu no Windows forçar um determinado tipo de letra e estilo, lá se vão os teus cálculos 😛

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

pronto, não encontrei nenhum erro, será que está bom assim?

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Dim numeroSuportado As Single = TextBox1.Width 'A variável de pixels suportados
        Dim numeroDigitado As Single = TextBox1.Font.Size * TextBox1.Text.Length ' A variável de pixels digitados
        Dim retOn As Boolean = False 'A variável de reticencias ativadas
        Dim caracteresSuportadas As Integer = TextBox1.Width / TextBox1.Font.Size 'A variável de Caracteres suportadas
        If retOn = False And numeroDigitado > numeroSuportado Then ' Se as reticências não estiverem visiveis e o numero (de pixels)digitado for maior que o numero(de pixels) suportado,
            retOn = True ' Retias visíveis =  verdade
            TextBox1.Text = TextBox1.Text.Remove(caracteresSuportadas - 3) + "..." 'O texto da textbox1 vai ser o próprio texto, sem as caracteres depois do numero da variável caracteresSuportadas - 3(reticências) + "..."
        End If
    End Sub

depois de muito tempo tentando, aí está!

Link to comment
Share on other sites

Não mateusb... percebeste alguma coisa do que te disse?

Com o teu código, basta agarrar em algo como, sei lá, Impact, que é o completo oposto de uma fonte monospaced, e obténs as reticências em sítios parvos, e mesmo em sítios diferentes quando usas caracteres mais compridos.

Ora vê abaixo.

Só com MeasureString é que consegues "pintar" a string com aquela fonte e medir o seu comprimento, antes sequer de aparecer, e aí decidir se está ou não da largura da textbox.

O código do user_unknown pode ser muito simplificado, mas a ideia por detrás de um "corte" de frase é aquela: escrever, medir o comprimento final e actuar.

O que estás a fazer apenas funciona em fontes monospaced, onde se garante que o comprimento de cada caractere é sempre o mesmo.

post_11186_1336857836_65.jpg

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.