Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Dotinho

Limitar tamanho de strings

Recommended Posts

Dotinho

Olá a todos mais uma vez venho pedir uma ajudinha.. é assim, já tive a pensar o não sei como irei fazer..

Fiz um programa para copiar ficheiros, mas em postas com nome muito comprido, queria fazer do tipo que o windows faz, por exmplo:

C:\khipyn\oimpoum\iubyiouby\iouybo\ibt\ioynpoyu\file.txt

se a label tivesse só 50pix de comprimento, fazia do tipo

C:\khipyn....ioynpoyu\file.txt

Alguém tem ideia como fazer isso? é que eu não sei medir o tamanho do texto...


Luis Lourenço

Share this post


Link to post
Share on other sites
paulo silva

Podes fazer de varias formas não sei qual a melhor.

   Dim valor As String = TextBox2.Text
        Dim valor1 As String = TextBox2.Text


        valor = valor.Remove(valor.Length - 2, 2)
        valor1 = valor1.Substring(valor.Length, 2)

        MsgBox(valor1, MsgBoxStyle.Critical, "Fim da string")

        MsgBox(valor, MsgBoxStyle.Critical, "valores a remover")

depois podes jogar com isto como achares melhor.

Cumprimentos Paulo Silva

Share this post


Link to post
Share on other sites
Dotinho

sim, mas o tamanho da string não pode ser medido assim, assim eu sei, mas não pode ser, pois as letras não tem todas o mesmo tamanho, tinha que ser medido em pixels. E não encontro função para isso..

Por exemplo: String1="lllllllllllllllllllll" ou String2="ooooooooooooooooooooooo"

cmps


Luis Lourenço

Share this post


Link to post
Share on other sites
paulo silva

Já encontrei a tua solução  :D

 
Imports System.Drawing

Private Sub Calculartamanho()

        Dim myHwnd As IntPtr

        Dim returnValue As Drawing.Graphics
        returnValue = Drawing.Graphics.FromHwnd(myHwnd)

        Dim tamanho As SizeF
        Dim myFont As New Font("Arial", 10)

        tamanho = returnValue.MeasureString(TextBox2.Text, myFont)

        Dim width As String = tamanho.Width


        MsgBox(width)
    End Sub

Vê se funciona

Cumprimentos Paulo Silva

Share this post


Link to post
Share on other sites
Dotinho

Sim, funciona, estou só a fazer o resto do código, quero usar um função para isso..


Luis Lourenço

Share this post


Link to post
Share on other sites
ribeiro55

Acabei de escrever este bloco só por curiosidade.

Espreita lá e vê se não é o que pretendes:

    Private Function MedirStr(ByVal Texto As String, ByVal Fonte As Font) As Integer
        Dim g As Graphics = Me.CreateGraphics
        Return CInt(g.MeasureString(Texto, Fonte).Width)
    End Function

    Private Function ReduzirStr(ByVal Texto As String, ByVal Fonte As Font, ByVal TamanhoAlvo As Integer) As String
        Const Separador As String = " (...) "

        If MedirStr(Separador, Fonte) > TamanhoAlvo Then Return "<>"
        If MedirStr(Texto, Fonte) < TamanhoAlvo Then Return Texto

        Dim TempStr As String = Texto

        Dim Parte1 As String = String.Empty
        Dim Parte2 As String = String.Empty

        While MedirStr(TempStr & Separador, Fonte) > TamanhoAlvo
            Parte1 = Strings.Left(TempStr, CInt(TempStr.Length / 2) - 2)
            Parte2 = Strings.Mid(TempStr, CInt(TempStr.Length / 2), TempStr.Length)
            TempStr = Parte1 & Parte2
        End While

        Return Parte1 & Separador & Parte2
    End Function

Para usar, por exemplo numa textbox:

        Dim TextoLongo As String = "C:\UmaPastita\DuasPastitas\TresPastitas\EUmFicheirito.lol"
        TextBox1.Text = ReduzirStr(TextoLongo, TextBox1.Font, TextBox1.Width)

Se usares numa label não te esqueças de retirar o AutoSize senão dá barraca.


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"

Share this post


Link to post
Share on other sites
Dotinho

Permite-me a alteração á tua função:

  Private Function ReduzirStr(ByVal Texto As String, ByVal Fonte As Font, ByVal TamanhoAlvo As Integer) As String
        Const Separador As String = " (...) "

        If MedirStr(Separador, Fonte) > TamanhoAlvo Then Return "<>"
        If MedirStr(Texto, Fonte) < TamanhoAlvo Then Return Texto

        Dim TempStr As String = Texto

        Dim Parte1 As String = String.Empty
        Dim Parte2 As String = String.Empty

        While MedirStr(TempStr & Separador, Fonte) > TamanhoAlvo
            Parte1 = Strings.Left(TempStr, CInt(TempStr.Length / 2) - 2)
            Parte2 = Strings.Mid(TempStr, CInt(TempStr.Length / 2), TempStr.Length)
            TempStr = Parte1 & Parte2
        End While
        Dim p1 = Parte1.Substring(0, Parte1.LastIndexOf("\") + 1)
        Dim p2 = Parte2.Substring(Parte2.IndexOf("\"))
        Return p1 & " ... " & p2
        'Return Parte1 & Separador & Parte2
    End Function

Em vez de deixar palavras a meio, corta pelas "\" ou seja, pelas pastas..

cmps


Luis Lourenço

Share this post


Link to post
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

×

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.