C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[62761] Re:ListView 드래그가 안됩니다.
장성호 [nasilso] 1561 읽음    2010-10-25 04:02
음...
님께서 원하시는것이

질문-해석1
바탕화면의 아이콘( 바탕화면도 ListView임) 이 자동정렬이 아닌 상태에서
마우스로 Drag해서 원하는곳이 아무데나가져다 놓으면
아이콘이 drop한 위치로 이동되는것을 원하시는것인가요?

질문-해석2
바탕화면의 아이콘( 바탕화면도 ListView임) 이 자동정렬인 상태처럼
마우스로 Drag해서 원하는곳이 아무데나가져다 놓으면
선택한 아이콘(아이템)이 그 위치에 끼워넣기 되고..
나머지 아이템은 자동으로 밀리길 원하시나요?

질문-해석3
아니면 drop된 위치의 아이템과 select한 아이템이 위치가 교체되기를 원하시나요?

================================================================
질문의 코드설명
님의 코드는 해석1에 해당되는것으로써..
저것도항상 저렇게 되는것이 아니라 ListView의 ViewStyle이  윈도우즈바탕화면처럼
vsIcon 또는 vsSmallIcon으로 되어있을때에 가능합니다.

vsReport나 vsList로 되어있을때는 안됩니다.

답변s
질문해석에 따라답변이 다른데요

먼저 해석3에 대한 답변은?

해석3-답변
해석3은 결국 item을 교체하는것인데요
TListIView에서 Item을 교체하는 기능을 제공하지는 않는것 같습니다.
Item의 내용을 하나하나 교체하면됩니다.
caption 및 ImageIndex , selectedIndex,Data 등...
교체를 편리하게 하기위해 ListItem을 하나 추가로 만들어서 하는 방법도 있습니다.
다음과 같이...
void __fastcall ExChagneListViewItem(TListView *listView,TListItem *Source,TListItem*Target)
{

  TListItem *New;

  listView->Items->BeginUpdate();
  try
  {
    New    = listView->Items->Add();
    New->Assign(Target);
    Target->Assign(Source);
    Source->Assign(New);
    delete New;
  }
  __finally
  {
    listView->Items->EndUpdate();
  }
}

void __fastcall TForm1::ListView1DragDrop(TObject *Sender, TObject *Source,
      int X, int Y)
{

    TListItem *SrcItem=ListView1->Selected;
    TListItem *TargetItem=ListView1->GetItemAt(X,Y);
   ExChagneListViewItem(SrcItem,TargetItem);

}


해석2-답변
선택한 아이템을 원하는 위치로 이동하기위해서는...
ViewStyle이 icon형태일때랑 list형태일 때랑 다르게 동작하는데요..

ViewStyle이 list형태일때는
TListView->Items->Insert(index) 함수가  index위치에 ListItem을 제대로 생성하지만
ViewStyle이 icon형태일때는 insert하면 맨뒤에 Add되기때문에...
TListView->Items->Insert를 써서 item을 이동하는것은 잘안됩니다.


ViewStyle이 list형태일때라고 가정하고 코드를 작성하면...
1) 원하는 위치에 item을 하나 insert한뒤에
2) Source아이템의 내용을 newitem에 assign하고
3) Source아이템을 삭제 하면됩니다.

void __fastcall TForm1::ListView1DragDrop(TObject *Sender, TObject *Source,
      int X, int Y)
{

    TListItem *SrcItem=ListView1->Selected;
    TListItem *TargetItem=ListView1->GetItemAt(X,Y);
    if(SrcItem==TargetItem)return;
    if(TargetItem==NULL)return;

    ListView1->Items->BeginUpdate();
    TListItem *NewItem=ListView1->Items->Insert(TargetItem->Index);
    NewItem->Assign(SrcItem);
    delete SrcItem;
    ListView1->Items->EndUpdate();

}
//---------------------------------------------------------------------------




윈도우즈바탕화면의 자동정렬 기능처럼
ListView스타일이 icon인 상태에서   해석3처럼 구현하려면...
조금 노가다가 필요할것도 같네요...(이건 안해봐서..)

그럼...


용맨소녀 님이 쓰신 글 :
: 여기 답변글을 참고해서 만들었는데요..
:
: 항목 이동은 안되네요..
:
: ListView의 DragMode를 dmAutomatic로 설정했고요..
:
: void __fastcall TWin_Code::View_CodeExecuteDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State,
:           bool &Accept)
: {
:     if(dynamic_cast<TListView *>(Source) == NULL)
:         return;
:
:     printf("111\n");
:
:     Accept = true;
:
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TWin_Code::View_CodeExecuteDragDrop(TObject *Sender, TObject *Source, int X, int Y)
: {
:     if(dynamic_cast<TListView *>(Source) == NULL)
:         return;
:
:     printf("222\n");
:
:     SendMessage(View_CodeExecute->Handle, LVM_SETITEMPOSITION, View_CodeExecute->ItemFocused->Index, MAKELPARAM(X, Y));
:
: }
:
: 이렇게 했는데요.. 찍어보니 해당 루틴으로 들어오기는 들어오는데, 리스트뷰의 아이템 이동은 안되는 것 같습니다..

+ -

관련 글 리스트
62757 ListView 드래그가 안됩니다. 용맨소녀 1060 2010/10/23
62761     Re:ListView 드래그가 안됩니다. 장성호 1561 2010/10/25
62773         감사합니다.. 용맨소녀 961 2010/10/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.