Shell   20-05-2023, 22:57
#1
Buenas!.

Viendo un ejemplo de Cogier sobre Drag y Drop, creé algo similar. Pero cuando el objeto es arrastrado fuera del lugar donde debe estar,
este se borra y se elimina de su contenedor de origen.

Tengo un panel con tres etiquetas. Cada etiqueta tiene una palabra que forman una frase desordenada.
Se trata de llevar cada etiqueta al otro panel y que la frase se pueda ver ordenada.

Una vez el control se ha arrastrado o creado en el otro panel, debe ser eliminado del panel de origen.

Para probar el efecto debe ser arrastrado fuera de su contenedor y que no sea el panel 2.

[Imagen: xFFwNB5.png]

Al pulsar el botón de check se comprueba si el orden de la frase es correcto.

Este es el código.

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[]
 
  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
      .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)  
    'If your drag to any place the control is deleted. :(
    Last.Delete
  Endif
 
End

Public Sub Panels_Drop()
 
  Dim lb As Label
    
  If Drag.type = Drag.Text Then     
    lb = New Label(Last) As "words"
    With lb
      .Text = Drag.Data      
      .AutoResize = True
      .W = Drag.Source.w
      .H = Drag.Source.h
      .Border = Border.Plain
      .Font.Size = Drag.Source.Font.Size
      .Padding = 5
    End With    
  Endif
  'Drag.Source.Delete
  'Is impossible delete the object here, the control is being dragged
 
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

Saludos
Última modificación: 21-05-2023, 21:24 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
vuott   20-05-2023, 23:57
#2
Me Confused parece que a mi funciona.
Cuando transporto el Control, que contiene una de las tres palabras, desde el Panel1 y lo coloco en el Panel2, el Control desaparece del Panel1.

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
Shell   21-05-2023, 00:08
#3
(20-05-2023, 23:57)vuott escribió: Cuando transporto el Control, que contiene una de las tres palabras, desde el Panel1 y lo coloco en el Panel2, el Control desaparece del Panel1.

Intenta arrastrarlo al formulario y soltarlo en este, desaparecerá del Panel1.

Saludos
Última modificación: 21-05-2023, 00:09 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
tincho   21-05-2023, 00:47
#4
El problema puede deberse a que el elemento sobre el cual se crea el drag es eliminado en el mismo evento del drag.
Código:
Public Sub words_MouseDrag()
 
  If Mouse.left Then    
    Last.Drag(Last.text)  
    'If your drag to any place the control is deleted. :(
    Last.Delete ' Esto tendrías que comentarlo
  Endif
 
End

1 Saludo.
Shell   21-05-2023, 10:18
#5
(21-05-2023, 00:47)tincho escribió: El problema puede deberse a que el elemento sobre el cual se crea el drag es eliminado en el mismo evento del drag.

Eso es lo primero que intenté. Pero la eliminación del source se debe ejecutar en alguna parte. Para saber que control es,
o de donde proviene.

La información real que se traspasa es el texto, el control es lo de menos, se va a crear un control similar en el otro panel
con la información del control source. El problema reside en eliminar el control en el panel origen y desde donde debe realizarse
o como hacerse.

Tengo de hace años otro ejemplo con dos ListView y no me ocurre eso.

Gracias a los dos.

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
vuott   21-05-2023, 16:45
#6
(21-05-2023, 00:08)Shell escribió: Intenta arrastrarlo al formulario y soltarlo en este, desaparecerá del Panel1.

¿Quieres que el Control con el texto, si lo sueltas fuera de Panel2 (por ejemplo, en el Formulario), no desaparezca de Panel1 ?
Última modificación: 21-05-2023, 16:45 por vuott.

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
Shell   21-05-2023, 19:38
#7
(21-05-2023, 16:45)vuott escribió: ¿Quieres que el Control con el texto, si lo sueltas fuera de Panel2 (por ejemplo, en el Formulario), no desaparezca de Panel1 ?

Eso es. Que solo se puede soltar en Panel2 o del Panel2 al Panel1 pero nunca al formulario.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
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: 5 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.