Le JSL original ne s'étend pas au-delà de deux cases, et il serait très difficile de le faire fonctionner, générique ou non, pendant plus de deux en raison de l'hypothèse que "l'autre boîte" a généré la traînée.Il y a un commentaire au début du code expliquant pourquoi MouseBox utilise la méthode de suivi (la souris se déplace mais le bouton n'est pas enfoncé) plutôt que les méthodes de clic ou de glisser... le clic et le glisser empêcheraient la ListBox de faire une sélection (et ensuite sourcer la traînée).Le JSL original est une solution de contournement pour quelque chose que la ListBox ne fait pas actuellement.
Sans modifications de la prise en charge interne de ListBox, je ne pense pas que vous trouverez un moyen totalement satisfaisant de glisser-déposer entre trois listbox ou plus.Vous devriez pouvoir créer plusieurs paires de boîtes, je pense, en utilisant le code d'origine ; il existe un test de diaphonie (vérifier que la sélection de l'autre case correspond au texte déplacé) qui détectera la plupart des tentatives d'abus.
Si vous n'avez pas besoin de supprimer l'élément sélectionné de la ListBox source, le problème est beaucoup plus simple.Utilisez le texte déposé pour créer un clone et ne vous inquiétez même pas de trouver l'autre zone puisque vous n'avez pas besoin de supprimer l'élément.
----
Vous pouvez créer des interfaces graphiques glisser-déposer plutôt sympas avec avec les messages << .L'une des clés pour les utiliser est de faire en sorte que dragBegin fournisse une chaîne pour son code de retour.C'est la chaîne que dropCommit recevra.L'index de script pour MouseBox setDropTrack contient un exemple de 15 puzzles avec ce JSL :
dragBegin = Function( {this, clickPt},
{x, y} = ceci << getUserData ;
Si( nextToBlank( x, y ),
((cet << enfant) << enfant) << getText/* le message est le contenu de la zone de texte */
, /* autre */
0 /* supprime le glisser */
);
);/* fonction pour supprimer le caractère de la cellule source, mais seulement si le dépôt a réussi */
Les lignes en gras montrent deux manières d'utiliser la valeur de retour : ignorer la tentative de déplacement lorsque la pièce du puzzle de 15 ne peut pas être déplacée, ou renvoyer la lettre si elle peut être déplacée.L'exemple comporte également d'autres fonctionnalités, telles que userData, qui permet de déterminer quels carrés sont adjacents.
Craig
Salut Craige, j'essaie de rendre vos listes de liste plus générales parce que je les adore, mais j'aimerais en créer un nombre illimité et les placer n'importe où.Je l'ai fait fonctionner mais cela semble vraiment capricieux avec la sélection.Pouvez-vous penser à quelque chose pour changer la sensibilité ou quoi que ce soit de la mousebox ?Je ne veux pas dépendre des relations enfants/parents.
Noms Par défaut ici ( 1 );
lié = Fonction ({lister}, {},
Boîte à souris (
<< SetDragEnable ( 1 ),
//<
<< SetDropEnable ( 1 ),
<< Définir le début du glissement (
Fonction ({ceci, cliquez surPt},
ceci<< Définir l'activation du dépôt ( 0 );
)
),
/*<
Fonction({this, clickPt},
ceci << Set DropEnable(0);
sel = (cet << enfant)<
ceci << SetUserData (sel)
)
),
<
Fonction({this, clickPt},
{destbox, sourcebox, lb, éléments, i, lb_source, lb_dest, index},
destbox = ceci << GetDestBox;
sourcebox = ceci << GetSourceBox;
show (boîte source);
/*lb_source = sourcebox << enfant;
sel = lb_source << Obtenir la sélection ;
lb_dest = destinationbox << enfant ;
items = lb_source << Obtenir les éléments ;
pour(i = 1, i<=nitems(sel), i++,
index = Contient (lb_source< );
lb_source << Supprimer l'élément (index);
lb_dest << Append(sel );
);
show (destbox, sel, texte, lb, index, éléments);
sourcebox << Définir Drop Enable (1);
1;*/
)
),*/
<< Définir la fin du glissement (
Fonction ({ceci, cliquez surPt, comment},
ceci<< Définir l'activation du dépôt ( 1 );
)
),
<< SetDropCommit (
Fonction ({this, clickPt, text},
{destbox, sourcebox, lb, éléments, i, lb_source, lb_dest, index},
boîte de destination = ceci << ObtenirDestBox ;
sourcebox = ceci << ObtenirSourceBox ;
montrer (boîte source);
lb_source = boîte source << enfant ;
sel = lb_source << Soyez sélectionné ;
lb_dest = boîte de destination << enfant ;
articles = lb_source << Obtenir des articles ;
pour (je = 1 , je<= articles (sel), i++,
indice = Contient (lb_source<< Obtenir des articles , sel );
lb_source << Retirer l'objet (indice);
lb_dest << Ajouter (sél )
);
montrer (destbox, sel, texte, lb, index, éléments) ;
boîte source << Définir l'activation du dépôt ( 1 );
1 ;
)
),
zone de liste (liste)
)
);
nouvelle fenetre ( "Test" ,
Boîte de liste (
lié({ "1" , "2" , "3" }),
lié({ "4" , "5" , "6" }),
lié({ "8" , "9" , "14" })
)
);
nouvelle fenetre ( "Autre fenêtre" , //je ne sais pas encore si c'est une bonne ou une mauvaise chose
lié({ "test" , "autres ceux-ci" , "truc" })
);
Je pense que j'ai tout compris... Je ne sais pas si cela sera utile à quelqu'un, mais je poste ici juste au cas où...
Garde la trace des index sélectionnés, puis les resélectionne après leur repositionnement.
/*
* 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);
);
);