다시 출력이라... 말의 의미가 참 애매한데요... 우선 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;
이만.. 원하시는 답변이 되었으면 좋겠네요..
|