setKey는 클릭/트랙/드래그 핸들러와 유사한 키스트로크 핸들러입니다.키 스트로크 .GetUserData는 당신이 원하는 것입니다. 둘 이상의 값이 필요한 경우 연관 배열, 목록 또는 행렬을 사용하십시오.
고마워요 크레이그.나는 내 생각에 그것을 알아 내기 시작했습니다.
Get/SetKey의 키는 정보를 저장하는 또 다른 방법입니까, 아니면 다른 용도로 사용됩니까?
원본 JSL은 두 개의 상자 이상으로 확장되지 않으며 "다른 상자"가 드래그 소스를 제공한다는 가정 때문에 두 개 이상의 상자에 대해 작동하도록 하는 것은 매우 어렵습니다.코드 시작 부분에는 MouseBox가 클릭이나 끌기 방법 대신 트랙(마우스는 움직이지만 버튼은 누르지 않음) 방법을 사용하는 이유를 설명하는 주석이 있습니다. 클릭과 끌기 모두 ListBox가 선택을 하는 것을 방해합니다. 드래그 소싱).원본 JSL은 ListBox가 현재 수행하지 않는 작업에 대한 해결 방법입니다.
내부 ListBox 지원을 변경하지 않으면 세 개 이상의 목록 상자 사이를 끌어서 놓을 수 있는 완전히 만족스러운 방법을 찾을 수 없을 것 같습니다.내 생각에는 원래 코드를 사용하여 여러 쌍의 상자를 만들 수 있을 것입니다. 대부분의 남용 시도를 감지하는 누화 테스트(다른 상자의 선택 항목이 드래그된 텍스트와 일치하는지 확인)가 있습니다.
소스 ListBox에서 선택한 항목을 제거할 필요가 없다면 문제는 훨씬 간단해집니다.삭제된 텍스트를 사용하여 복제본을 만들고 항목을 제거할 필요가 없으므로 다른 상자를 찾는 것에 대해 걱정하지 마세요.
----
꽤 멋진 드래그 앤 드롭 GUI를 구축할 수 있습니다. << .이를 사용하는 핵심 중 하나는 dragBegin이 반환 코드에 대한 문자열을 제공하도록 하는 것입니다.이는 dropCommit이 수신하게 될 문자열입니다.MouseBox setDropTrack의 스크립팅 인덱스에는 다음 JSL이 포함된 15개의 퍼즐 예제가 있습니다.
dragBegin = 함수({this, clickPt},
{x, y} = 이 << getUserData;
If( nextToBlank( x, y ),
((this << child) << child) << getText/* 메시지는 텍스트 상자 내용입니다 */
, /* 또 다른 */
0 /* 드래그 억제 */
);
);/* 소스 셀에서 문자를 제거하는 함수(드롭이 성공한 경우에만 해당) */
굵은 선은 반환 값을 사용하는 두 가지 방법을 보여줍니다. 15개 퍼즐 조각을 이동할 수 없을 때 끌기 시도를 무시하거나 이동할 수 있는 경우 문자를 반환하는 것입니다.이 예제에는 인접한 사각형을 파악하는 데 도움이 되는 userData와 같은 몇 가지 다른 기능도 있습니다.
크레이지
안녕 Craige, 나는 이것을 좋아하기 때문에 귀하의 목록 상자를 더 일반화하려고 노력하고 있지만 목록 상자를 원하는 만큼 만들어서 어디에나 두고 싶습니다.나는 그것을 작동시키고 있지만 선택이 정말 까다로워 보입니다.마우스박스의 감도나 기타 사항을 변경하기 위해 생각할 수 있는 것이 있습니까?나는 자녀/부모 관계에 의존하고 싶지 않습니다.
이름 기본값은 여기입니다. ( 1 );
링크됨 = 기능 ({목록}, {},
마우스박스 (
<< 끌기 활성화 설정 ( 1 ),
//<
<< 드롭 활성화 설정 ( 1 ),
<< 드래그 시작 설정 (
기능 ({이것, clickPt},
이<< 드롭 활성화 설정 ( 0 );
)
),
/*<<트랙 설정(
함수({this, clickPt},
this << Set DropEnable(0);
sel = (이 << 자식)<<선택됨;
이 << SetUserData(sel)
)
),
<
함수({this, clickPt},
{destbox, 소스박스, lb, 항목, i, lb_source, lb_dest, index},
destbox = this << GetDestBox;
sourcebox = this << GetSourceBox;
표시(소스박스);
/*lb_source = 소스박스 << child;
sel = lb_source << 선택 가져오기;
lb_dest = destbox << 자식;
items = lb_source << 항목 가져오기;
for(i = 1, i<=nitems(sel), i++,
index = Contains(lb_source<<항목 가져오기, sel );
lb_source << 항목 제거(색인);
lb_dest << 추가(sel );
);
show(destbox, sel, text, lb, index, items);
sourcebox << 드롭 활성화 설정(1);
1;*/
)
),*/
<< 끌기 끝 설정 (
기능 ({이것, clickPt, 어떻게},
이<< 드롭 활성화 설정 ( 1 );
)
),
<< SetDropCommit (
기능 ({이것, clickPt, 텍스트},
{destbox, 소스박스, lb, 항목, i, lb_source, lb_dest, index},
destbox = 이 << GetDestBox ;
소스박스 = this << GetSourceBox ;
보여주다 (소스박스);
lb_source = 소스박스 << 어린이 ;
셀 = lb_source << 선택받기 ;
lb_dest = 대상박스 << 어린이 ;
항목 = lb_source << 아이템 받기 ;
~을 위한 (나 = 1 , 나는<= 항목 (sel), i++,
지수 = 포함 (lb_소스<< 아이템 받기 , 셀 );
lb_소스 << 항목 제거 (색인);
lb_dest << 추가 (셀 )
);
보여주다 (destbox, sel, 텍스트, lb, 인덱스, 항목);
소스박스 << 드롭 활성화 설정 ( 1 );
1 ;
)
),
리스트 박스 (목록)
)
);
새창 ( "시험" ,
Hlistbox (
링크됨({ "1" , "2" , "삼" }),
링크됨({ "4" , "5" , "6" }),
링크됨({ "8" , "9" , "14" })
)
);
새창 ( "다른 창" , //아직 좋은 것인지 나쁜 것인지 확실하지 않습니다.
링크됨({ "시험" , "다른 이것들" , "물건" })
);
@Craige_Hales 단 하나의 목록 상자에만 클릭/끌기 기능을 추가하기 위한 이상적인 설정일까요? 즉. 사용자가 항목을 선택하고 끌어 목록 순서를 조정할 수 있는 항목 목록이 포함된 목록 상자입니다. 그렇지 않다면 내 해결 방법은 위쪽 및 아래쪽 화살표 버튼이 될 것이라고 생각합니다. 효과적이지만 상호 작용하기에는 느립니다.
선택한 항목을 조작하는 위/아래 버튼이 정답이라고 생각합니다. 나는 목록 상자 항목 번호와 마우스 상자 픽셀 수준 좌표를 정렬하는 것이 강력한 솔루션이 될 것이라고 생각하지 않습니다.
줄을 섰던 것 같은데... 누군가에게 도움이 될지는 모르겠지만 만약을 대비해 여기에 글을 올립니다...
선택한 인덱스를 추적한 다음 위치가 변경된 후 다시 선택합니다.
/*
* 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);
);
);