No entiendo muy bien que es lo que quiere hacer. Además hay lo que parece un Array que no defines cambiar_palabra().
Ten en cuenta que al usar
ListBox_separar.Items.Add se crea un nuevo Item en el ListBox cada vez que añade un elemento y por eso se te muestra así:
Hola
Mundo
Como
Puedes usar una Variable string para añadir las palabras y luego meterlas en el ListBox:
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim oracion As String = "Hola Mundo Como estas?" 'Trim(TextBox_oracion.Text())
Dim i As Integer = 1
Dim posicion As Integer
Dim palabra As String
Dim NuevaFrase As String = Nothing
Do
posicion = InStr(i, oracion, Convert.ToChar(Keys.Space))
If posicion > 0 Then
palabra = Mid(oracion, i, posicion - i)
NuevaFrase += palabra
posicion += 1
i = posicion
End If
Loop Until posicion = 0
ListBox1.Items.Add(NuevaFrase)
End Sub
End Class
Aunque tu código no parece estar bien ya que cuando se acaban los "" el bucle no puede continuar y se queda en: "HolaMundoComo"
Te recomiendo que uses un
Array y la función
Split.
Creo que este es el código que buscas:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Cadena As String = "Hola Mundo Como estas?"
Dim Array() As String = Cadena.Split(Convert.ToChar(Keys.Space))
Dim NuevaCadena As String = Nothing
For I As Integer = 0 To Array.Count - 1
NuevaCadena += Array(I)
Next
ListBox1.Items.Add(NuevaCadena)
End Sub
De todos modos, he realizado varios códigos más, uno saca las palabras distintas a "" y vuelve a generar la frase (en btnNormal ) y el otro código hace lo mismo pero coloca las palabras en orden aleatorio (btnAleatorio). Esta vez, he creado otra variable Lista, para meter cada palabra, para luego ordenarlas o desordenarlas, poner espacios o carácteres entre ellas, etc.
No añadas ningún control, ni botones, ni ListBox, tan solo crea un nuevo proyecto Windows Form y copia y pega este código. Luego ejecuta el programa.
Los controles se crean desde el Evento Load.
Option Explicit On
Option Strict On
Public Class Form1
Dim lstLista1 As ListBox = New ListBox 'Nuevo ListBox
Dim lstLista2 As ListBox = New ListBox 'Nuevo ListBox
Dim btnNormal As Button = New Button 'Nuevo Button
Dim btnAleatorio As Button = New Button 'Nuevo Button
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
With Me
.Controls.Add(lstLista1)
.Controls.Add(lstLista2)
.Controls.Add(btnNormal)
.Controls.Add(btnAleatorio)
.Size = New System.Drawing.Size(445, 200)
.Text = "Demo"
End With
lstLista1.Location = New Point(10, 10)
lstLista1.Width = 200
lstLista2.Location = New Point(lstLista1.Left + lstLista1.Width + 10, 10)
lstLista2.Width = 200
With btnNormal
.Size = New System.Drawing.Size(150, 23)
.Location = New Point(CInt((lstLista1.Width / 2) - (btnNormal.Width / 2) + lstLista1.Left), lstLista1.Height + lstLista1.Top + 10)
.Text = "Frase Normal"
End With
With btnAleatorio
.Size = New System.Drawing.Size(150, 23)
.Location = New Point(CInt((lstLista2.Width / 2) - (btnAleatorio.Width / 2) + lstLista2.Left), lstLista2.Height + lstLista2.Top + 10)
.Text = "Frase desordenada"
End With
AddHandler btnNormal.Click, AddressOf btnNormal_Click
AddHandler btnAleatorio.Click, AddressOf btnAleatorio_Click
End Sub
Private Sub btnNormal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim IndexItem As Integer = 0
Dim Cadena As String = "Hola Mundo Como estas?" & ControlChars.CrLf & "Estoy bien"
Cadena = Cadena.Replace(ControlChars.CrLf, Convert.ToChar(Keys.Space))
Dim Array() As String = Cadena.Split(Convert.ToChar(Keys.Space)) 'Crea un Item en el array por cada palabra de la Cadena {"Hola","","que","","tal"...}
Dim Lista As New List(Of String)
For I As Integer = 0 To Array.Length - 1
Lista.Add(Array(I))
Next
Dim NuevaCadena As String = Nothing 'String para la nueva cadena
For Each Palabra As String In Lista
NuevaCadena += Palabra & Convert.ToChar(Keys.Space)
Next
lstLista1.Items.Clear()
lstLista1.Items.Add(DBNull.Value)
lstLista1.Items(IndexItem) = NuevaCadena
End Sub
Private Sub btnAleatorio_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim IndexItem As Integer = 0
Dim Cadena As String = "Hola Mundo Como estas?" & ControlChars.CrLf & "Estoy bien"
Cadena = Cadena.Replace(ControlChars.CrLf, Convert.ToChar(Keys.Space))
Dim Array() As String = Cadena.Split(Convert.ToChar(Keys.Space)) 'Crea un Item en el array por cada palabra de la Cadena {"Hola","","que","","tal"...}
Dim Lista As New List(Of String) 'Lista para las palabras
For I As Integer = 0 To Array.Length - 1 Then
Lista.Add(Array(I))
Next
Dim NumAleatorio As Integer
Dim Rand As New Random 'El equivalenta a Rnd() de VB (no necesita es uso Randomize())
Dim NuevaCadena As String = Nothing 'String para la nueva cadena
Do
NumAleatorio = Rand.Next(0, Lista.Count)
'Obtiene un número aleatorio entre 0 y el número de elementos de la lista
NuevaCadena += CStr(Lista(NumAleatorio).ToString & Convert.ToChar(Keys.Space))
'Elimina el elemento de de la lista con índice = NumAleatorio (para evitar repetir palabras)
Lista.RemoveAt(NumAleatorio)
My.Application.DoEvents()
Loop Until Lista.Count = 0
lstLista2.Items.Clear()
lstLista2.Items.Add(DBNull.Value)
lstLista2.Items(IndexItem) = NuevaCadena
End Sub
Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
Me.StartPosition = FormStartPosition.CenterScreen
End Sub
End Class
Quiero comentar que en .NET aunque se pueden usar algunos miembros de Microsoft.VisualBasic, así como Split, IntStr, Mid, char, etc. VB.Net tiene unos miembros y clases propias para realizar estas funciones.
Como exprogramadores de VB6 (yo a veces lo uso para según que cosas), nuestra mente, a la hora de procesar una idea y pasarla a código de programación le cuesta abandonar la lógica de VB, y aunque pasemos a VB.NET no podemos evitar darle ese toque VB. Mientras que los que comienzan directamente a programar a .NET, ven incluso absurdo, innecesario y rebuscado un código en .NET con la lógica VB.
Yo he leído PDFs y libros en el que se usa indistintamente elementos de VB como de .NET, pero hay gente a la que no le gusta. Incluso en MSDN muchas veces en sus ejemplos de código hay elementos de VB. Personalmente no veo ningún problema en usarlos, pero es bueno también saber lo nuevo en .NET porque en muchos casos se reduce notablemente el volumen de código. Ocurre igual con los que empezaron con C y se pasaron a C++ o C#.
Algunos cambios
--VB--> Ubound(Array) --VB.NET--> Array.Count
--VB--> Char(código) --VB.NET--> convert.ToChar(código)
--VB--> Mid(Cadena, Start, Lenght) --VB.NET--> Cadena.Substring(Start, Length)
--VB--> UCase(Cadena) --VB.NET--> Cadena.ToUpper
Puedes encontrar algunas equivalencias entre VB y VB.NET aquí.
http://en.wikibooks.org/wiki/Visual_Basic_.NET/Visual_Basic_6_to_.NET_Function_Equivalents