How to Select the second line of a textbox text and move it to the first line

Asked

Viewed 554 times

-1

I’m trying to make a text editor, but I’m finding it difficult to find a solution to select the second line of text in a multi-line textbox and I want to change the second line by pepper. I’ve tried to research it and I can’t find any example.

This was the attempt I made but without expected result.

Dim CRPos As Integer

    CRPos = TextBox1.Text.IndexOf(Chr(10))

    If CRPos > -1 Then

        TextBox1.Select(1, CRPos)
        TextBox1.SelectionLength = CRPos
        TextBox1.SelectedText = ""

    End If

1 answer

0


The control TextBox owns the property Lines, which returns an array of String with each line of text contained in the control.

In addition the control also exposes the methods GetFirstCharIndexFromLine() and GetFirstCharIndexOfCurrentLine(), which return the index of the first character of a given line or of the current line (line numbering starts at zero).

Then the code to select the second row of a TextBox property Multiline defined as True could be so:

Private SelecionarLinha2()

   ' Primeiro é necessário verificar se há pelo menos duas linhas.
   If TextBox1.Lines.Count > 1 Then
      ' Seleciona trecho do texto do controle começando no
      ' primeiro caractere da segunda linha (lineNumber=1).
      TextBox1.Select(TextBox1.GetFirstCharIndexFromLine(1), TextBox1.Lines(1).Length)
      ' Se o foco não for enviado para o controle TextBox, a seleção não aparecerá.
      TextBox1.Focus()
   End If

End Sub

And the code to exchange the second line for the first:

Private Sub TrocarLinha2PorLinha1()

   ' Primeiro é necessário verificar se há pelo menos duas linhas.
   If TextBox1.Lines.Count > 1 Then
      Dim troca As String
      ' Quando a propriedade Lines é criada automaticamente a partir
      ' do texto digitado no controle, o array retornado por ela é
      ' apenas uma cópia somente leitura das linhas do controle,
      ' então, o texto não pode ser alterado diretamente na propriedade,
      ' por isso é necessário usar um array temporário.
      Dim linhas() As String = TextBox1.Lines

      ' Troca a segunda linha pela primeira linha.    
      troca = linhas(1)
      linhas(1) = linhas(0)
      linhas(0) = troca

      ' Devolve o array modificado para o controle.    
      TextBox1.Lines = linhas
   End If

End Sub

You could also do the same things using the "old-fashioned way".
Here the code to select the second line:

Private SelecionarLinha2_JeitoAntigo()

   Dim posQuebraDeLinha As Integer = -1
   Dim firstCharIndex As Integer = -1
   Dim lineTwoLength As Integer = 0

   ' Busca pela quebra de linha da primeira linha.
   posQuebraDeLinha = TextBox1.Text.IndexOf(vbCrLf)
   If posQuebraDeLinha < 0 Then Return
   ' Índice do primeiro caractere da segunda linha.
   firstCharIndex = posQuebraDeLinha + 2   '2 = Len(vbCrLf)

   ' Busca pela quebra de linha da segunda linha.
   posQuebraDeLinha = TextBox1.Text.IndexOf(vbCrLf, firstCharIndex)
   If posQuebraDeLinha < 0 Then posQuebraDeLinha = TextBox1.TextLength

   ' Calcula o comprimento do texto na segunda linha.
   lineTwoLength = posQuebraDeLinha - firstCharIndex

   TextBox1.Select(firstCharIndex, lineTwoLength)
   TextBox1.Focus()

End Sub

And the code to trade the second line for the first, "old-fashioned way":

Private Sub TrocarLinha2PorLinha1_JeitoAntigo()

   Dim troca As String
   ' Divide o texto usando a sequência de CarriageReturn (13) + LineFeed (10)
   ' como separador, resultando em um array em que cada item é uma linha.
   Dim linhas() As String = TextBox1.Text.Split(vbCrLf)

   If linhas.Count > 1 Then
      troca = linhas(1)
      linhas(1) = linhas(0)
      linhas(0) = troca

      ' Junta de volta as linhas do array, usando de novo a sequência
      ' de CarriageReturn (13) + LineFeed (10) como separador.
      TextBox1.Text = String.Join(vbCrLf, linhas)
   End If

End Sub

Browser other questions tagged

You are not signed in. Login or sign up in order to post.