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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[899] [Controls] Virtual ListView 에 대해
장성호 [nasilso] 11931 읽음    2009-06-30 01:58
개인적으로 가끔 쓰는데..
여기 볼포에 소개되지도 않았구, 주변에 별로 쓰는 사람도 없고해서 소개해 봅니다.

이미 왠만한 경력자는  다 알고 있는것이지만
VirtualListView라는게 따로 컴포넌트가 있는게 아닙니다.
그냥 기본 컴포넌트인 TListView를 사용하는 방법에 대한 이야기 입니다.

다음  bcbjournal에 보면  VirtualListView에 대해 상세히 나와있구
http://bcbjournal.org/articles/vol4/0001/Fast_updates_with_virtual_list_views.htm

CBuilder 설치폴더에 아래 Examples에 보면
샘플 프로젝트가 있습니다.


VirtualListView란?
1) 실제 ListView에 Item을 Add하지 않고
2) 그냥  "ListView->Items->Count = 몇개" 이런식으로 갯수를 설정하면 됩니다.
3) 그리고 화면에 보여지는 부분만 OnData이벤트를 통해서 요청할때 넣어주면 됩니다.
4) 실제 Item을 add하지 않으므로 프로그램에서 직접 item의 내용을 관리해야 합니다.


TListView가 VirtualListView로 동작하려면?
  1) TListView의  OwnerData프로퍼티를 true로만 해주면 됩니다.
  2) 그리고 TListView의 OnData이벤트에서 넘어온 파라메터의 Item 을 보내 적당한 내용을 서정해주면 됩니다.

void __fastcall TForm3::ListView1Data(TObject *Sender, TListItem *Item)
{
      Item->Caption=IntToStr(Item->Index);
}

//---------------------------------------------------------------------------

위 코드에는 data를 따로 관리한 부분이 없는데..
item과 item->Index를 이용하여
적절한 item의 내용을 찾아와서 설정해주면 됩니다.
TStringList *m_pCapLst;
TStringList *m_pSubLst;
TStringList *m_pTemp;

void __fastcall TForm3::FormCreate(TObject *Sender)
{
   m_pCapLst=new TStringList;
   m_pSubLst=new TStringList;
   m_pTemp=new TStringList;

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

void __fastcall TForm3::Button1Click(TObject *Sender)
{
    for(int i=0;i<100;i++)
    { 
        m_pCapLst->Add("test");
        m_pSubLst->Add("test1,test2,test3");
   }
      
   ListView1->Items->Count = m_pCapLst->Count ;
    // 다음과 같이  ListView_SetItemCountEx 를 이용해도 됩니다.
    // ListView_SetItemCountEx(ListView1->Handle, m_pCapLst->Count, LVSICF_NOINVALIDATEALL|LVSICF_NOSCROLL);

   }

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

void __fastcall TForm3::ListView1Data(TObject *Sender, TListItem *Item)
{
   if(Item->Index < m_pCapLst->Count )
   {
         Item->Caption=m_pCapLst->Strings[Item->Index];
         m_pTemp->CommaText = m_pSubLst->Strings[Item->Index];
         for(int i=0; i < m_pTemp->Count ; i++)         
         {
              Item->SubItems->Add(m_pTemp->Strings[i]);
         }
   }
}
//---------------------------------------------------------------------------



 
위와같이 실제 Data를 TStringList나 직접 메모리에서 관리를 해도 되구..
만들어서 넣어두 되구..  그렇습니다.


VirtualListView의 장점은?
  1) 아이템을 하나하나 add하지 않으므로 item추가 속도가 빠릅니다.
      (virtualListview는 item추가 시간이 의미가 없으니까요.  화면 update시간만 필요할뿐)
  2) 검색이 용이합니다.
     listview의 item이나 subitem의 내용을 검색하고 할때
     위와같이 StringLIst등에서 직접 data를 관리한다면 listView를 통하지 않고 검색을 엄청 빨리할수 있겠죠
3) Sorting및 data교환 등이 편리합니다.
     문론 위와 같은 원리겠죠

주의할점
   ListItem의 caption이나 subitems->Strings에 직접 접근해서 내용을 확인해봐도 내용이 없습니다.
   왜냐하면 OnData이벤트에서 받은 내용은 화면에 뿌릴때만 사용하고
   TListView에서 가지고 있지 않기때문이죠

윈도우즈의  탐색기에서 오른쪽에 파일리스트는 SysListView32 인데 위와같은 virtuallistview로 구현되어있을 것입니다.

그럼..
김태선 [cppbuilder]   2009-07-03 10:16 X
좋은 팁이네요 ^^,


+ -

관련 글 리스트
899 [Controls] Virtual ListView 에 대해 장성호 11931 2009/06/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.