Die ursprüngliche JSL lässt sich nicht über zwei Boxen hinaus skalieren, und es wäre sehr schwierig, sie für mehr als zwei Boxen zum Laufen zu bringen, egal ob generisch oder nicht, da angenommen wird, dass „die andere Box“ den Widerstand verursacht.Am Anfang des Codes gibt es einen Kommentar, der erklärt, warum MouseBox die Track-Methode (Mausbewegungen, aber Taste nicht gedrückt) anstelle der Klick- oder Ziehmethoden verwendet ... Sowohl Klicken als auch Ziehen würden verhindern, dass die ListBox eine Auswahl trifft (und dann Beschaffung des Widerstands).Die ursprüngliche JSL ist ein Workaround für etwas, das die ListBox derzeit nicht kann.
Ohne Änderungen an der internen ListBox-Unterstützung glaube ich nicht, dass Sie eine völlig zufriedenstellende Möglichkeit finden werden, per Drag & Drop zwischen drei oder mehr Listboxen zu wechseln.Ich denke, Sie sollten in der Lage sein, mit dem Originalcode mehrere Boxpaare zu erstellen. Es gibt einen Cross-Talk-Test (überprüfen, ob die Auswahl des anderen Kästchens mit dem gezogenen Text übereinstimmt), der die meisten Missbrauchsversuche erkennt.
Wenn Sie das ausgewählte Element nicht aus der Quell-ListBox entfernen müssen, ist das Problem viel einfacher.Verwenden Sie den abgelegten Text, um einen Klon zu erstellen, und machen Sie sich nicht einmal Gedanken darüber, das andere Feld zu finden, da Sie das Element nicht entfernen müssen.
----
Sie können einige ziemlich coole Drag'n'Drop-GUIs erstellen mit den Nachrichten << .Einer der Schlüssel zu ihrer Verwendung besteht darin, dass DragBegin einen String als Rückgabecode bereitstellt.Das ist die Zeichenfolge, die dropCommit empfängt.Der Skriptindex für MouseBox setDropTrack enthält ein 15-Puzzle-Beispiel mit dieser JSL:
dragBegin = Function( {this, clickPt},
{x, y} = this << getUserData;
If( nextToBlank( x, y ),
((dieses << Kind) << Kind) << getText/* die Nachricht ist der Textfeldinhalt */
, /* anders */
0 /* das Ziehen unterdrücken */
);
);/* Funktion zum Entfernen des Zeichens aus der Quellzelle, aber nur, wenn das Löschen erfolgreich war */
Die fetten Linien zeigen zwei Möglichkeiten, den Rückgabewert zu verwenden: Ignorieren des Ziehversuchs, wenn das 15-teilige Puzzleteil nicht verschoben werden kann, oder Zurückgeben des Buchstabens, wenn er verschoben werden kann.Das Beispiel verfügt auch über einige andere Funktionen, z. B. userData, mit dessen Hilfe ermittelt werden kann, welche Quadrate benachbart sind.
Craige
Hallo Craige, ich versuche deine Listenfelder allgemeiner zu gestalten, weil ich diese liebe, aber ich würde gerne eine beliebige Anzahl davon erstellen und sie irgendwo platzieren.Ich habe es zum Laufen gebracht, aber die Auswahl scheint wirklich schwierig zu sein.Fällt Ihnen irgendetwas ein, um die Empfindlichkeit oder irgendetwas an der Mousebox zu ändern?Ich möchte nicht auf die Beziehungen zwischen Kind und Eltern angewiesen sein.
Namen standardmäßig hier ( 1 );
verknüpft = Funktion ({Liste}, {},
Mousebox (
<< SetDragEnable ( 1 ),
//<
<< SetDropEnable ( 1 ),
<< Legen Sie den Drag-Beginn fest (
Funktion ({this, clickPt},
das<< Legen Sie die Drop-Aktivierung fest ( 0 );
)
),
/*<
Function({this, clickPt},
this << Set DropEnable(0);
sel = (this << child)<
this << SetUserData(sel)
)
),
<
Function({this, clickPt},
{destbox, sourcebox, lb, items, i, lb_source, lb_dest, index},
destbox = this << GetDestBox;
sourcebox = this << GetSourceBox;
show(sourcebox);
/*lb_source = sourcebox << child;
sel = lb_source << Ausgewählt werden;
lb_dest = destbox << child;
items = lb_source << Get Items;
for(i = 1, i<=nitems(sel), i++,
index = Enthält(lb_source< );
lb_source << Remove Item(index);
lb_dest << Append(sel );
);
show(destbox, sel, text, lb, index, items);
sourcebox << Set Drop Enable(1);
1;*/
)
),*/
<< Legen Sie das Ende des Ziehens fest (
Funktion ({this, clickPt, how},
das<< Legen Sie die Drop-Aktivierung fest ( 1 );
)
),
<< SetDropCommit (
Funktion ({this, clickPt, text},
{destbox, sourcebox, lb, items, i, lb_source, lb_dest, index},
destbox = dieses << GetDestBox ;
sourcebox = this << GetSourceBox ;
zeigen (Quellenbox);
lb_source = sourcebox << Kind ;
sel = lb_source << Werden Sie ausgewählt ;
lb_dest = Zielbox << Kind ;
items = lb_source << Holen Sie sich Artikel ;
für (ich = 1 , i<= nitems (sel), i++,
Index = Enthält (lb_source<< Holen Sie sich Artikel , sel );
lb_source << Gegenstand entfernen (Index);
lb_dest << Anhängen (selbst )
);
zeigen (destbox, sel, text, lb, index, items);
Quellbox << Legen Sie die Drop-Aktivierung fest ( 1 );
1 ;
)
),
Listenfeld (Liste)
)
);
neues Fenster ( "Prüfen" ,
Hlistbox (
verknüpft({ „1“ , „2“ , "3" }),
verknüpft({ „4“ , „5“ , „6“ }),
verknüpft({ „8“ , „9“ , „14“ })
)
);
neues Fenster ( „Anderes Fenster“ , //Ich bin mir noch nicht sicher, ob das eine gute oder eine schlechte Sache ist
verknüpft({ "prüfen" , „Andere diese“ , "Sachen" })
);
Ich glaube, ich habe es verstanden ... Ich bin mir nicht sicher, ob das für irgendjemanden von Nutzen sein wird, aber ich poste es hier für alle Fälle ...
Verfolgt die ausgewählten Indizes und wählt sie erneut aus, nachdem sie neu positioniert wurden.
/*
* 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);
);
);