Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Naftali

Contar linhas de um label

Recommended Posts

Pessoal, gostaria de saber se tem como contar quantas linhas tem no label, se tiver vai me ajudar muito.Por exemplo, tenho um texto.bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla E gostaria que ao verificar me retornasse 5. Quantidade de linhas.Tem como?

Compartilhar este post


Link para o post
Compartilhar em outros sites

falai Naftali,

 

uma forma seria assim:

Dim x, i As Integer		i = 0		x = 0		While x <> -1			x = Me.lblContaLinhas.Text.IndexOf(vbNewLine, x)			If (x <> -1) Then				x += 1				i += 1			End If		End While		MessageBox.Show("numero de linhas --> " & i)

obs.: caso descobrir uma forma mais simples posta ae

 

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim:

 

MessageBox.Show("Quantidade de linhas: " & Label1.Text.Split(vbCrLf).Length.ToString())

Onde "Label1" é a label em questão.

 

Abraços,

 

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

eriva_br, tentei a sua lógica, mas só retorna 0. E a do Graymalkin só me retorna 1, só foi me retornar 2 com um texto grande...Não tem nenhuma outra forma?

Compartilhar este post


Link para o post
Compartilhar em outros sites

aqui funcionou com as duas dicas, apesar q fiz usando o vb2005qual o texto que você está analisando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estava usando uma série de As, ai ele quebra a linha sozinho, mas isso era só pra teste, o que vai ser contado são pequenos textos.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIsso...Testei agora com um texto mesmo, e maior. Mas mesmo assim não contou nada...

Compartilhar este post


Link para o post
Compartilhar em outros sites

como está a propriedade AutoSize, se estiver false, muda pra true, pois se estiver false, conforme vai digitando varios 'As' ele vai pulando a linha automaticamente, mas isso não é um ENTER e sim uma "caida"..rsrs

 

pra ficar com ENTER (pulo de linha) clica no combo que fica do lado da propriedade Text, vai abrir uma caixa pra você digitar o texto e te dar a possibilidade de dar um ENTER REAL

 

veja:

Imagem Postada

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, mas eu não posso deixar a propriedade como autosize, pq senão ele não vai pular linhas (já tentei), e sim deixar o label mais largo...Eu estou deixando o label com o tamanho fixo. E nele, verificar a quantidade de linhas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, no texto, fisicamente, *não* existem quebras-de-linha? Se for o caso, você vai precisar saber o tamanho, em pixels, do texto todo e dividir pela largura, também em pixels, da label.Abraços,Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah tah... Então, mas saber a largura do label em pixels é fácil, mas e pra saber o tamanho do texto em pixels?

Compartilhar este post


Link para o post
Compartilhar em outros sites

No VB6 eu fazia isso (obter a largura em pixels de um texto) com a função GetTextExtentPoint32() da API Win32. É bem provável que ainda seja possível fazer o mesmo no VB.NET. A declaração dela você encontra no API-Guide: http://www.allapi.net/ ou http://www.mentalis.org/

 

Abraços,

 

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tentei mas não deu certo, procurei lá mas não funcionou, usei a ferramenta pra transformar o código de VB6 pra .NET, mas ele não reconheceu... Bom, vou fazer como tinha imaginado de princípio, pegar mais ou menos quantos caracteres têm por linha, e então separar na mão.Mas valeu de qualquer forma...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui funcionou. Eu declarei o seguinte:

 

Public Structure POINTAPI		Dim X As Integer		Dim Y As Integer	End Structure	Private Declare Auto Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" (ByVal hdc As IntPtr, ByVal lpsz As String, ByVal cbString As Integer, ByRef lpSize As POINTAPI) As Boolean

Depois utilizei ela assim:

 

Dim tam1, tam2 As POINTAPI		Dim s1 As String = "W"		Dim s2 As String = "llll"		GetTextExtentPoint32(Me.CreateGraphics().GetHdc(), s1, s1.Length, tam1)		GetTextExtentPoint32(Me.CreateGraphics().GetHdc(), s2, s2.Length, tam2)		Me.CreateGraphics().DrawString(String.Format("{0} = Largura: {1}", s1, tam1.X), Me.Font, Brushes.Black, 0, 0)		Me.CreateGraphics().DrawString(String.Format("{0} = Largura: {1}", s2, tam2.X), Me.Font, Brushes.Black, 0, 20)

Certo? ;)

 

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo bem, mas onde que isso me retorna algo? Não consegui entender direito...Fora que as vezes retorna isso:An unhandled exception of type 'System.InvalidOperationException' occurred in system.drawing.dllAdditional information: Objeto está sendo usado em outro lugar.Acredito que seja pq estava redimensionando o label, justamente por isso que queria saber quantas linhas também, pra fazer uma pequena animação, diminuindo, aumentando, usando timer... Estou fazendo isso pela quantidade de caracteres, mas é impreciso, por isso queria contar as linhas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo bem, mas onde que isso me retorna algo? Não consegui entender direito...

Os valores que você quer estão em tam1.X e tam2.X, que são as respectivas larguras dos textos "W" e "llll". No caso, eu coloquei os textos no próprio código, mas bastaria aplicar a mesma idéia ao texto de uma label.Abraços,Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui, mas o problema agora é que depois de um tempo rodando ele me retorna o erro que citei antes... Não, tem como evitar isso? Tentei dar um resume next, mas mesmo assim, continua dando erro...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você utiliza essa função constantemente? Ou seja, faz várias chamadas sucessivas a ela?Abraços,Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.