2011-11-30 3 views
4

런타임 중에 기존 열 사이에 새 열을 추가하면 하위 열 인덱스가 예상 한 것과 같지 않습니다.TListView : 런타임 중에 기존 열 사이에 새 열을 추가 한 후 하위 명령

colums[0] | colums[1] | (new) columns[2] | columns[3] 
caption | subitems[0] | subitems[2]  | subitems[1] 

하지만 난 가정 것이다 : 두 번째와 세 번째 열 사이에 열을 새 열을 추가 한 후/하위 항목은 다음과 같이

colums[0] | colums[1] | (new) columns[2] | columns[3] 
caption | subitems[0] | subitems[1]  | subitem[2] 

내가 동적으로 아래의 하위 항목의 내용을 업데이트 할 수 있어야합니다 어떤 조건. 그래서 Column.Index = X 인 열에 대한 하위 항목이 Item.SubItems [X-1]에 있다는 가정에 의존하고 싶습니다.

기본 동작이며 지정된 동작이라고 생각하십니까? 그렇다면 열에 따라 하위 항목을 업데이트 할 때 무엇을 제안 하시겠습니까? 최근에 추가 된 열에 속한 하위 항목 인덱스를 저장하는 중일 수 있습니다.

참고 : Columns.Tag 속성은 이미 사용 중입니다.

저는 델파이 XE와 XE2를 사용하고 있지만 델파이 7 이상과 호환되어야합니다.

+3

의 정확한 중복 : ([뷰 TListView 런타임 동안 새 열 및 하위 항목을 추가] http://stackoverflow.com/questions/8258386/tlistview-adding-new-column-and-subitems-during-runtime)을 작성하십시오. –

+1

정말로 ... 어쩌면 당신은 토론을 읽지 않았을 것입니다 ... 이것은 단지 작은 발췌 일 뿐이며 다른 스레드의 설명 된 버그의 일부가 아닙니다. – torno

+0

사실, 나는 그것을 계속 진행하고 있었고, 지금 연결하기 전에 아주 신중하게 읽었습니다. –

답변

3

당신은 당신이 항상 목록보기 컨트롤 자체를 요청할 수, 인덱스 위치를 저장하기 위해 열 '원래의 위치 필요가 없습니다 : 질문의 예를 들어

procedure TForm1.Button1Click(Sender: TObject); 
var 
    ColumnOrder: array of Integer; 
begin 
    SetLength(ColumnOrder, ListView1.Columns.Count); 
    ListView_GetColumnOrderArray(ListView1.Handle, ListView1.Columns.Count, 
           PInteger(ColumnOrder)); 


을의 ColumnOrder 배열 개최 (0, 1, 3, 2). 새로 삽입 된 열 (세 번째 열에서 왼쪽)의 하위 항목을 업데이트하려는 경우 원래 위치는 '3'입니다. 코드 예제 :

var 
    ColumnOrder: array of Integer;  
    SubIndex: Integer; 
begin 
    SetLength(ColumnOrder, ListView1.Columns.Count); 
    ListView_GetColumnOrderArray(ListView1.Handle, ListView1.Columns.Count, 
           PInteger(ColumnOrder)); 

    SubIndex := ColumnOrder[2]; // We want to update 3rd column from left 
           // (visually -> SubItems[1]) 

    // Test if the index is not 0, otherwise it holds an *item*, 
    // not a subitem (the first column can change position too). 
    if SubIndex > 0 then begin  
    Dec(SubIndex);    // VCL subitems are 0 based 
    ListView1.Items[1].SubItems[SubIndex] := 'updated!'; 
    end; 


당신이 열을 추가하는 당신이 other question의 버그에 대한 수정이있는 경우 당신은 돈 있으면 바로 다시 주문 기존이는 다시 다음 (작동하지 않는 경우 ' t, 열 다시 정렬 및 열 추가 기능을 제공하는 것은 어쨌든 불가능합니다).


관련하여 기본 동작이 있어야하는 경우 'name', 'size', 'date'열이있는 파일 정보를 표시하는 목록보기가 있다고 가정합니다. 개발자는 사용자가 '크기'열을 넣을 위치에 대해 걱정할 필요가 없습니다. 정보를 'SubItems [0]'에 넣으면됩니다. 더군다나 사용자가 '이름'열을 드래그하면 항목이 하위 항목으로 강등됩니다.

나는 항목/하위 항목이 각각의 열을 따를 것이라고 기대하는 것은 단지 논리적 인 생각하는 것 ..

+0

sertac, 고마워. 내일은 이것 좀 봐. – torno

+0

이것은 매우 훌륭하게 작동합니다! 정확히 내가 무엇을 찾고 있었는지. 정말 고마워. 및 : 이동/열 0 응용 프로그램에서 불가능합니다 : – torno

+0

당신을 환영합니다! –