Buenas!.
Parece que lo he solucionado.
Un control si no se destruye, se puede reutilizar. En este caso, parece lo más acertado.
Aparentemente no puedo destruir algo que se está arrastrando.
Por de pronto para que el formulario no admita que algo se pueda soltar en el, se puede hacer:
Código:
Public Sub Form_Open()
Me.Drop = False
End
¿ Qué es realmente lo que paso de un lado a otro ?.
¿ Cuál es la información ?.
El texto que contiene la etiqueta,
no la etiqueta en si.
Entonces puedo. Si sé que el panel 1 tiene tres etiquetas, creo el mismo número de etiquetas en el panel 2, pero en este las hago todas invisibles.
No vamos a crear más etiquetas, solo las necesarias.
Ahora bien, ¿ Cómo se va añadiendo la información a esas etiquetas ?. En orden.
Se comprueba cada una de las etiquetas del panel 2 ( si estamos pasando del panel 1 al panel 2 ), la primera etiqueta
del panel 2 que este invisible y que su texto sea una cadena vacía, se hace visible y se le pasa el texto que se ha arrastrado.
Luego rompemos el bucle, para que no se llene de etiquetas con el mismo contenido.
Y hasta ahí parece que funciona.
Código:
Private aphrase As String[] = ["Order", "the", "phrase"]
Private tobject As Object
Private stext As String
Public Sub Form_Open()
Dim lb As Label
Dim adisorderphrase As String[]
Me.Drop = False
adisorderphrase = aphrase.Copy()
adisorderphrase.Shuffle()
Panel1.Arrangement = Arrange.Column
For ICount As Integer = 0 To adisorderphrase.Max
lb = New Label(Panel1) As "words"
With lb
.text = adisorderphrase[ICount]
.Font.Size = 18
.Alignment = Align.Center
.AutoResize = True
.Padding = 5
.Tag = ICount
.Border = Border.Plain
End With
'palabras.Add(lb)
Next
'Hago la misma operación, creo las etiquetas en el panel2, pero invisibles
For ICount As Integer = 0 To adisorderphrase.Max
lb = New Label(Panel2) As "words"
With lb
.text = ""
.Font.Size = 18
.Alignment = Align.Center
.AutoResize = True
.Padding = 5
.Visible = False 'Si no lo destruyo lo hago invisible
.Tag = ICount
.Border = Border.Plain
End With
Next
End
Public Sub words_enter()
tobject = Last
stext = Last.text
End
Public Sub words_MouseDrag()
If Mouse.left Then
Last.Drag(Last.text, "text/plain")
Endif
End
Public Sub Button1_Click()
Dim wrong As Boolean
If Panel2.Children.Count = aphrase.Count Then
For r As Integer = 0 To aphrase.Max
tobject = Panel2.Children[r]
If aphrase[r] <> tobject.text Then
wrong = True
Break
Endif
Next
If wrong Then
Message.Error(("The order of words isn't correct"), "OK")
Else
Message.Info(("The order of words is correct"), "OK")
Endif
Else
Message.Error(("There aren't enough words on the panel"), "OK")
Endif
End
Public Sub Panels_Drop()
Dim lb As Label
If Drag.type = Drag.Text Then
For Each lb In Last.Children
If lb.Visible = False Then
lb.Visible = True
lb.Text = Drag.Data
Break
Endif
Next
Endif
Drag.Source.Visible = False
End
Tengo que traducir los textos, claro.
Os añado el código que funciona.
Siempre el verdadero problema es el entender el problema y como se debería hacer.
¿ Puedo borrar el control ?.
¿ Necesito borrar el control ?.
¿ Puedo reutilizar ese control ?.
Aún tiene un fallo menor, que es que la frase este en el orden correcto.
Saludos