El JSL original no escala más allá de dos cuadros, y sería muy difícil lograr que funcione, genérico o no, para más de dos debido a la suposición de que "el otro cuadro" generaba el arrastre.Hay un comentario al principio del código que explica por qué MouseBox usa el método de seguimiento (el mouse se mueve pero el botón no se presiona) en lugar de los métodos de hacer clic o arrastrar... tanto hacer clic como arrastrar impedirían que ListBox haga una selección (y luego obtener el arrastre).El JSL original es una solución para algo que ListBox no hace actualmente.
Sin cambios en el soporte interno de ListBox, no creo que encuentre una manera completamente satisfactoria de arrastrar y soltar entre tres o más cuadros de lista.Creo que deberías poder hacer varios pares de cajas usando el código original; Hay una prueba de interferencia (verificar que la selección de la otra casilla coincida con el texto arrastrado) que detectará la mayoría de los intentos de abuso.
Si no necesita eliminar el elemento seleccionado del ListBox de origen, entonces el problema es mucho más sencillo.Utilice el texto soltado para hacer un clon y ni siquiera se preocupe por encontrar el otro cuadro, ya que no necesita eliminar el elemento.
----
Puedes crear algunas GUI geniales de arrastrar y soltar. Con los mensajes << .Una de las claves para usarlos es hacer que dragBegin proporcione una cadena para su código de retorno.Esa es la cadena que recibirá dropCommit.El índice de secuencias de comandos para MouseBox setDropTrack tiene un ejemplo de 15 rompecabezas con este JSL:
arrastrarComienzo = Función( {esto, hacer clic},
{x, y} = esto << getUserData;
Si (siguienteABlanco (x, y),
((este << niño) << niño) << getText/* el mensaje es el contenido del cuadro de texto */
, /* demás */
0 /* suprime el arrastre */
);
);/* función para eliminar el carácter de la celda de origen, pero solo si la eliminación fue exitosa */
Las líneas en negrita muestran dos formas de usar el valor de retorno: ignorar el intento de arrastre cuando la pieza de 15 rompecabezas no se puede mover o devolver la letra si se puede mover.El ejemplo también tiene otras características, como los datos de usuario que ayudan a determinar qué cuadrados son adyacentes.
Craige
Hola Craige, estoy tratando de hacer que tus cuadros de lista sean más generales porque me encantan, pero me gustaría crear cualquier número de ellos y colocarlos en cualquier lugar.Lo tengo funcionando pero parece muy complicado con la selección.¿Se te ocurre algo para cambiar la sensibilidad o algo del mousebox?No quiero tener que depender de las relaciones entre padres e hijos.
Nombres predeterminados aquí ( 1 );
vinculado = Función ({lista}, {},
caja del ratón (
<< Establecer arrastrar habilitar ( 1 ),
//<
<< EstablecerDropEnable ( 1 ),
<< Establecer inicio de arrastre (
Función ({esto, haga clic en Pt},
esto<< Establecer habilitación de caída ( 0 );
)
),
/*<
Función ({esto, hacer clic en Pt},
esto << Establecer DropEnable(0);
sel = (este << niño)<
esto << SetUserData(sel)
)
),
<
Función ({esto, hacer clic en Pt},
{destbox, sourcebox, lb, elementos, i, lb_source, lb_dest, index},
destbox = este << GetDestBox;
cuadro fuente = esto << GetSourceBox;
mostrar (cuadro fuente);
/*lb_source = cuadro de origen << niño;
sel = lb_source << Obtener seleccionado;
lb_dest = cuadro de destino << niño;
artículos = lb_source << Obtener artículos;
para(i = 1, i<=nitems(sel), i++,
index = Contiene(lb_source< );
lb_source << Eliminar elemento(índice);
lb_dest << Agregar(sel );
);
mostrar(destbox, sel, texto, lb, índice, elementos);
cuadro de origen << Establecer habilitación de caída (1);
1;*/
)
),*/
<< Establecer final de arrastre (
Función ({esto, haga clic en Punto, cómo},
esto<< Establecer habilitación de caída ( 1 );
)
),
<< Establecer compromiso de entrega (
Función ({esto, clickPt, texto},
{destbox, sourcebox, lb, elementos, i, lb_source, lb_dest, index},
caja de destino = esto << ObtenerDestBox ;
cuadro fuente = esto << Obtener caja de origen ;
espectáculo (cuadro fuente);
lb_source = caja de origen << niño ;
sel = lb_fuente << Ser seleccionado ;
lb_dest = caja de destino << niño ;
artículos = lb_fuente << Obtener artículos ;
para (yo = 1 , yo<= nitems (sel), i++,
índice = Contiene (lb_fuente<< Obtener artículos , yo );
lb_fuente << Remover el artículo (índice);
lb_dest << Adjuntar (sel )
);
espectáculo (destbox, sel, texto, lb, índice, elementos);
cuadro de origen << Establecer habilitación de caída ( 1 );
1 ;
)
),
cuadro de lista (lista)
)
);
nueva ventana ( "Prueba" ,
cuadro de lista (
vinculado({ "1" , "2" , "3" }),
vinculado({ "4" , "5" , "6" }),
vinculado({ "8" , "9" , "14" })
)
);
nueva ventana ( "Otra ventana" , //aún no estoy seguro si esto es algo bueno o malo
vinculado({ "prueba" , "otros estos" , "cosa" })
);
Creo que lo tengo solucionado... No estoy seguro de si esto será útil para alguien, pero lo publicaré aquí por si acaso...
Realiza un seguimiento de los índices seleccionados y luego los vuelve a seleccionar una vez que se han reposicionado.
/*
* Changes position of selected list items, moving them up in rank
*/
On Move Up = function({this},
selectedList = listBoxBoxVariable << Get Selected;
selectedIndices = listBoxBoxVariable << Get Selected Indices;
myNewIndices = List();
listBoxBoxVariable << Remove Selected;
<BR />
For Each({index, i}, selectedIndices,
tempName = selectedList[i];
newInsertIndex = Max(i-1,index-2);
listBoxBoxVariable << Insert(tempName, newInsertIndex);
Insert Into(myNewIndices, newInsertIndex+1);
);
For Each({index, i}, myNewIndices,
listBoxBoxVariable << Set Selected(index);
);
);
/*
* Changes position of selected list items, moving them down in rank
*/
On Move Down = function({this},
selectedList = listBoxBoxVariable << Get Selected;
selectedIndices = listBoxBoxVariable << Get Selected Indices;
myNewIndices = List();
listBoxBoxVariable << Remove Selected;
For Each({index, i}, selectedIndices,
tempName = selectedList[i];
newInsertIndex = Min(Length(TagListBox << Get Items),index);
listBoxBoxVariable << Insert(tempName, newInsertIndex);
Insert Into(myNewIndices, newInsertIndex+1);
);
For Each({index, i}, myNewIndices,
listBoxBoxVariable << Set Selected(index);
);
);