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

델파이 Q&A
Delphi Programming Q&A
[4156] [답변] SHS007/ [델파이 : ZPDSPF님] ListView CustomSo
박지훈.임프 [cbuilder] 1641 읽음    1998-08-22 12:36
안녕하세요. 천리안 프로그래머 포럼 C++Builder 담당자 임펠리테리입니다.

답변이 늦어서 죄송합니다. 요즘 제가 정신이 없어서리... ^^;;

그렇더라도 전에 답변 드린것이 생각처럼 잘 안되신다면 바로 다시 질문을 올려주셨

으면 좋았을텐데, 저도 좀 지나가면 다시 뒤적거려봐야 하고 해서 좀 번거롭거든요..

간단한 예제를 만들어봤습니다. 빌더로 코딩한거라 C++스타일이지만 델파이를 하시는

분들도 어떻게 하는 건지는 금방 알아보실수 있을겁니다. 소스를 구성하기 전에 먼저

폼에 리스트뷰를 하나 놓고, 스타일을 리포트로, 그리고 두개의 컬럼을 만들어서 각

각 file name, size로 하였습니다. 물론 이름이 중요한건 아니고, 컬럼이 두개면 됩

니다. 다음 소스는 폼의 OnCreate와 리스트뷰의 OnColumnClick, OnCompare 이벤트

핸들러입니다.

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    TSearchRec sr;
    TListItem *ListItem;
    if(FindFirst("*.*", faAnyFile, sr)==0)
        do
        {
            ListItem = ListView1->Items->Add();
            ListItem->Caption = sr.Name;
            ListItem->SubItems->Add(sr.Size);
        } while(FindNext(sr) == 0);
} // 화일들을 찾아서 리스트뷰의 첫컬럼과 두번째 컬럼에 각각 이름/크기를 넣음

void __fastcall TForm1::ListView1ColumnClick(TObject *Sender,
         TListColumn *Column)
{
    int LParam = Column->Caption == "Size" ? 1 : 0;
    ListView1->CustomSort(NULL, LParam);
}

void __fastcall TForm1::ListView1Compare(TObject *Sender, TListItem *Item1,
      TListItem *Item2, int Data, int &Compare)
{
    if(Data == 1)
        Compare = Item1->SubItems->Strings[0].ToInt() - Item2->SubItems->Strings[0].ToInt();
    else
        Compare = AnsiStrComp(Item1->Caption.c_str(), Item2->Caption.c_str());
}

맨처음 폼의 OnCreate 핸들러에서 현 디렉토리의 화일들을 찾아서 미리 리스트뷰에

각각의 컬럼에 이름과 크기를 넣어줬습니다. 실행하면 리스뷰에 현 디렉토리의 화일

들의 이름과 크기가 주욱 나올겁니다.

두번째 리스트뷰의 컬럼클릭 핸들러에서 CustomSort()함수를 호출하였습니다. 호출하

면서 CustomSort()의 두번째 인자로서 특정 값을 넘겨줬는데, 이걸 넘겨준 것은, 이

게 바로 OnCompare의 Data 인자로 그대로 넘겨지기 때문에, 이걸 클릭한 컬럼이 어느

컬럼인지를 판별하는 용도로 사용한겁니다.

세번째 OnCompare 핸들러에서 Data의 값에 따라 화일네임을 비교할 것인지 사이즈를

비교할것인지를 따져서 화일네임을 비교할 경우 스트링 비교함수인 AnsiStrComp()

함수를, 사이즈를 비교할 경우는 그냥 사이즈를 빼줘서 그 값을 Compare 인자에 넣어

줬습니다. OnCompare 핸들러는 단순히 비교한 결과를 0보다 크다, 0과 같다, 0보다

적다, 이렇게 세가지 경우만 구분되도록 Compare 인자에 넣어주면 되니깐요.

이렇게 코딩을 하셔서 실행해보시면 두개의 컬럼을 클릭함에 따라 화일네임/사이즈로

소트가 됩니다.

만약 컬럼에 따라 구분할 필요없이 언제나 스트링 비교연산만 한다면 리스트뷰의

AlphaSort()메소드를 써봄직도 합니다만, 이 함수는 반대방향, 즉 Decending 소트가

안되겠죠? 만약 위 소스에서 반대방향 소트를 하고 싶을 경우가 있다면 -1을 곱해서

Compare에 넣어주면 되겠네요.

그럼 도움되시길 바라면서, 이만...




독립문에서 임펠리테리였습니다.

(cbuilder, skyhi18, cbuilder@thrunet.com)

p.s. : '임펠리테리'는 제가 좋아하는 메탈그룹의 이름이자 그 그룹의 리드기타 이름
       이기도 합니다. Somewhere over the rainbow라는 멋진 명곡이 있죠~ ^^;;



+ -

관련 글 리스트
4156 [답변] SHS007/ [델파이 : ZPDSPF님] ListView CustomSo 박지훈.임프 1641 1998/08/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.