VCL에서 DragDrop기능은 TControl에 잘 구현되어 있습니다.
DragMode 가 dmManual 일 경우에 대게
1. Control->BeginDrag()
- MouseDown이나 MouseMove 이벤트 또는 아무때든지 ...
2. OnDragOver 이벤트 핸들러에서 Accept 결정
3. OnDragDrop 이벤트 핸들러에서 Drop후에 작업 코딩
아래는 간단한 TStringGrid를 이용한 DragDrop 샘플입니다.
int ADragCol,ADragRow;
void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
//
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if(Shift.Contains(ssLeft) )
{
StringGrid1->MouseToCell(X,Y,ADragCol,ADragRow);
StringGrid1->BeginDrag(true,0);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1DragOver(TObject *Sender,
TObject *Source, int X, int Y, TDragState State, bool &Accept)
{
int ARow,ACol;
StringGrid1->MouseToCell(X,Y,ACol,ARow);
if(ARow==ADragRow)Accept=false;
else Accept=true;
// Drag 하는 Row와 현재 마우스위치의 Row가 같으면 Accept=false
// Accept=false 인경우에 마우스를 놓아도 DragDrop이벤트가 발생하지 않음
}
//---------------------------------------------------------------------------
//Drop하면 Source와 Target 의 Row를 Replace함
void __fastcall TForm1::StringGrid1DragDrop(TObject *Sender,
TObject *Source, int X, int Y)
{
int ADropRow,ADropCol;
StringGrid1->MouseToCell(X,Y,ADropCol,ADropRow);
TStringList *lst=new TStringList;
lst->Assign(StringGrid1->Rows[ADragRow]);
StringGrid1->Rows[ADragRow]->Assign(StringGrid1->Rows[ADropRow]);
StringGrid1->Rows[ADropRow]->Assign(lst);
delete lst;
}
//---------------------------------------------------------------------------
그럼..
김재범 님이 쓰신 글 :
: stringgrid 에서 drag&drop을 하려고 합니다.
:
: 사용하는 함수나 예제가 부족해서 어떻게 사용해야 할지 잘 모르겠네요.
:
: 영상리스트를 만들어서 드래그 앤 드롭으로 영상의 순서를 바꿀수 있도록 하려고 합니다.
:
: 노드를 사용해서 하는 거라 바로 사용할수는 없겠지만, 사용 예제와 함수 등을 좀 알려주시면 감사하겠습니다.
:
: tmsstringgrid를 사용햇는데 사용면에서는 같은것 같으니 stringgrid 사용법을 알려주시면 감사하겠습니다.
:
: 전 계속 또 찾아봐야겠네요 ..
:
: 아래에 제가 임의 적으로 구현하고 싶은 코드를 짜봤습니다. 작동은 안 합니다. ;;
: 제가 하고 싶어하는 것을 코드로 설명하기 위한 예시용?
: 엉성한 저의 코드 실력 나오네요 ...
:
: void __fastcall TForm1::GridDragDrop(TObject *Sender, TObject *Source,
: int X, int Y)
: {
: int Index = Grid->Row - 1; // 현재 선택된 row 값을 얻기위해.
: int ARow,ACol;
:
: Grid->MouseToCell(X,Y,ACol,ARow); // 도착한 row 값의 얻기 위해
: TPlayListObject Object = *m_List->Items[Index]; // 선택한 row값의 정보를 저장
:
: if(m_Client->SetObject(CHANNEL, ARow, Object)) // 도착한 row 값에 저장하는게 맞다면 실행.
: {
: *m_List->Items[ARow] = Object; // 도착한 row 값에 저장 후 다시 그리기..
: RefreshList();
: RepaintList();
: }
: else
: {
: Memo1->Lines->Add(AnsiString().sprintf("SetObjectParam Error"));
: }
: }