Shell   21-05-2023, 21:24
#8
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. Wink

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. Rolleyes

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
Archivos adjuntos
.gz
DragDropWords-0.0.2.tar.gz (Tamaño: 12.52 KB Descargas: 2)
Última modificación: 21-05-2023, 21:30 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.