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
[11330] Re:ListView에서 특정 라인만 다시출력....ㅠㅠ
DrK [] 2321 읽음    2007-05-08 22:01
다시 출력이라... 말의 의미가 참 애매한데요... 우선 Repaint라고 생각한다면 다음의 코드를 생각할 수 있습니다..

procedure TForm1.Button1Click(Sender: TObject);
var
  R: TRect;
  Item: TListItem;
begin
  for Item in ListView1.Items do
  begin
    if SameText(Item.Caption, 'A') then
    begin
      R := Item.DisplayRect(drBounds);
      InvalidateRect(ListView1.Handle, @R, False)
    end;
  end;
end;

말 그대로 해당 아이템의 영역만 다시 출력하죠...

그런데 TListItem의 Caption이나 SubItems 프러퍼티를 설정하면 바로 TListView에 표시되기 때문에 단순히 Repaint의 의미로 사용하신 것은 아닌듯 합니다. 유추하건데 'A'인건만 리스트뷰에 남고 나머지는 다 숨기는 기능을 원하신다면... 애석하게도 TListView는 그런 기능이 없습니다. (유명한 VirtualTreeView는 있습니다만.. ^^)

리스트뷰로 그것을 구현한다고 치면 데이터를 따로 가지고 있고, 원하는 내용에 따라서 리스트뷰의 아이템에 넣어주면 됩니다.

우선 대충 데이터를 넣을 클래스를 만들고...

  TData = class
    Caption, SubItem1, SubItem2, SubItem3: String;
  end;

폼에다가 모든 아이템들을 넣을 변수를 선언해줍니다.

    FItems: TObjectList;


폼 생성할때 대략 1000개 를 임시로 넣어둡니다.

procedure TForm1.FormCreate(Sender: TObject);
Const
  Count = 1000;
  Captions = 'ABC';
var
  I: Integer;
  Item: TData;
begin
  FItems := TObjectList.Create;

  ListView1.Items.BeginUpdate;

  for I := 0 to Pred(Count) do
  begin
    Item := TData.Create;
    Item.Caption := Captions[I mod 3 + 1];
    Item.SubItem1 := 'SubItem 1 ' + IntToStr(I);
    Item.SubItem2 := 'SubItem 2 ' + IntToStr(I);
    Item.SubItem2 := 'SubItem 3' + IntToStr(I);
    FItems.Add(Item);
    ListView1.Items.Add.Data := Item;
  end;

  UpdateItemFromData(NIL);    // 이 프러시저는 맨 마지막에 있음 ^^

  ListView1.Items.EndUpdate;
end;


이렇게하면 리스트부에 1000개의 아이템이 보이는데... 버튼을 하나 만들고 버튼 핸들러에다가 다음처럼 원하는 것만 선택해서 리스트뷰에 넣어주면 되겠지요..

procedure TForm1.Button1Click(Sender: TObject);
var
  AData: Pointer;
begin
  ListView1.Items.BeginUpdate;

  ListView1.Items.Clear;
  for AData in FItems do                // for var in collection은 Delphi 2005부터 나온 문법
    if SameText(TData(AData).Caption, 'A')  then
      ListView1.Items.Add.Data := AData;
  UpdateItemFromData(NIL);
  ListView1.Items.EndUpdate;
end;

이렇게하면 이제 Caption이 A인 아이템만 남고 다 사라집니다. ^^;

마지막으로 UpdateItemFromData는 제가 자주쓰는 패턴으로 리스트뷰에 실제 데이터를 넣어놓고 거기서 가져다가 리스트뷰를 채워주는 프로시져네요... Item 파라미터가 NIL이면 모든 리스트 아이템을 업데이트 합니다.

procedure TForm1.UpdateItemFromData(Item: TListItem);
var
  Data: TData;
begin
  if Assigned(Item) then
  begin
    Data := Item.Data;

    Item.Caption := Data.Caption;
    Item.SubItems.Clear;
    Item.SubItems.Add(Data.SubItem1);
    Item.SubItems.Add(Data.SubItem2);
    Item.SubItems.Add(Data.SubItem3);
  end else begin
    for Item in ListView1.Items do
      UpdateItemFromData(Item);
  end;
end;


이만.. 원하시는 답변이 되었으면 좋겠네요..

+ -

관련 글 리스트
11321 ListView에서 특정 라인만 다시출력....ㅠㅠ 이종 1773 2007/05/03
11330     Re:ListView에서 특정 라인만 다시출력....ㅠㅠ DrK 2321 2007/05/08
11325     Re:ListView에서 특정 라인만 다시출력....ㅠㅠ 김도완 2199 2007/05/04
11322     Re:ListView에서 특정 라인만 다시출력....ㅠㅠ civilian,안영제 2095 2007/05/03
11324         Re:Re:죄송한데요.. 이해가안가서요..ㅠㅠ 이종 1863 2007/05/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.