2013-02-17 4 views
2

ListView에서 언제든지 기존의 ListItem에 개체를 첨부 할 수 있습니까? (나는 ListItem에 AddItem이라는 객체를 붙일 수 있지만 ListItem을 만든 후에 객체를 첨부해야 함을 알고 있습니다.)이미 존재하는 ListItem에 객체 첨부하기?

+0

'Data'를 사용하는 대신'OnCreateItemClass'를 사용하고'TListItem'의 전용 서브 클래스를 만들 수 있습니다. –

+0

@DavidHeffernan 감사합니다. 어떻게하는지 예제가 있습니까? – user1580348

+0

목록 항목에 무엇을 저장하고 있습니까? –

답변

6

TListItem.Data 속성을 통해 액세스 할 수 있습니다. 예를 들어 :

var 
    ListItem: TListItem; 
begin 
    ListView1.AddItem('Item 1', nil); 
    ... 
    ListItem := ListView1.Items[0]; 
    ListItem.Data := Edit1; 
    TEdit(ListItem.Data).Text := 'Updated text...'; 
end; 
+0

감사합니다. 객체를 ListItem에 연결하는 방법을 알 필요가 있습니다. 객체가 AddItem으로 첨부 된 후 객체에 액세스하는 방법이 아니라, 만들어진 후에 ListItem에 객체를 연결할 수 있어야합니다. 감사. – user1580348

+4

@user - 첫 번째 문장은 여러분의 답입니다 : Item.Data : = ... –

5

당신은 TListItemData 속성을 사용하여이 문제를 해결 할 수있다. 종종 쉽고 빠르게 접근 할 수 있습니다. 약간의 주름은 관련 데이터의 수명을 관리하기 위해 목록 항목이 필요한 경우입니다. 이 경우 노드가 소멸 될 때 연결된 데이터를 마무리하려면 OnDeletion 이벤트 처리기를 구현해야합니다.

대체 방법은 TListItem의 하위 클래스를 사용하는 것입니다.

type 
    TMyListItem = class(TListItem) 
    private 
    FDateTime: TDateTime; 
    public 
    property DateTime: TDateTime read FDateTime write FDateTime; 
    end; 

그런 다음 목록보기의 OnCreateNodeClass 이벤트에 대한 처리기를 구현 : 첫째, 서브 클래스를 정의합니다. 이것은리스트 뷰가 인스턴스화하는리스트 아이템의 실제 클래스를 결정합니다.

procedure TForm1.ListView1CreateItemClass(Sender: TCustomListView; 
    var ItemClass: TListItemClass); 
begin 
    ItemClass := TMyListItem; 
end; 

이제 목록보기는 TMyListItem 클래스 항목을 생성합니다.

따라서 다른 속성처럼 목록 항목의 DateTime 속성에 액세스하면됩니다. 물론이 접근법은 더 많은 정보를 저장하도록 확장 될 수 있습니다.

다른 점은 목록보기 컨트롤에서 컴파일 시간이 TListItem 인 항목을 제공한다는 것뿐입니다. 그래서 당신은 상영 할 필요가 있습니다.

예를 들어, 항목을 편집 할 때 무엇인가하고 싶다고 가정 해보십시오. 이벤트 핸들러는 다음과 같습니다 항목 유형 TListItem로 전달됩니다

procedure ListView1Edited(Sender: TObject; Item: TListItem; var S: string); 

하는 것으로. 따라서 다음과 같이 작성해야합니다 :

procedure TForm1.ListView1Edited(Sender: TObject; Item: TListItem; 
    var S: string); 
var 
    MyItem: TMyListItem; 
begin 
    MyItem := Item as TMyListItem; 
    if MyItem.DateTime .... 
end; 
+0

감사합니다, David, 대체 접근 방식에 대한 훌륭하고 광범위한 설명입니다! 그러나 CreateItemClass 대안을 사용할 때 사용자가 항목을 삭제하면 어떻게됩니까? ListView도 추가 된 사용자 정의 데이터 필드를 처리하고 삭제합니까? (예 : FDateTime). – user1580348

+1

예. 항목에 대해 무료로 전화를 걸면 해당 필드는 개체의 필드와 마찬가지로 처분됩니다. –

+0

모든 ListView 메서드 구현에서 Item 매개 변수를 상향 캐스트해야합니까, 아니면 사용자 지정 데이터 필드에 액세스해야하는 곳에서만 필요합니까? – user1580348

관련 문제