2011-02-28 3 views
3

TListView 컨트롤에서 빈 셀과 인접 셀을 구분하는 표 선을 숨기려면 어떻게해야합니까? HTML colspan 테이블 속성 또는 Excel의 "셀 병합"명령과 같습니다. 정상적인 경계를 유지하기 위해 텍스트가있는 셀을 원합니다.리스트 뷰에서 빈 셀의 그리드 라인을 어떻게 생략 할 수 있습니까?

Example

+0

빈 열을 제거하면 무엇을 의미합니까? –

+0

잠시 동안 조사한 결과 강력한 솔루션이있는 것 같지 않습니다. –

+0

사람들이 아직 모호하지 않은 질문을 왜 상향 왜하는지 나는 결코 이해하지 못했습니다. –

답변

3

당신은 TVirtualStringTree를 사용할 수 있습니다. 빈 열을 자동으로 확장하는 옵션 toAutoSpanColumns가 있습니다.

+0

+1. 내 시도가 Windows 트리보기 (신뢰할 수있는)이 작업을 수행 할 수 없습니다 제안 했으므로 타사 구성 요소를 좋은 선택이 될 수 있습니다. –

+0

왜 이것을 다운 그레이드 했습니까? –

+1

@ Andreas - 확실하지는 않지만, 아마도 그 대답이 * 질문에 대답하지 않고 시작했기 때문에 * .. –

1

이 문제에 대한 강력한 해결책이없는 것 같습니다.

나쁜 솔루션은, 그러나,

procedure TForm4.FormShow(Sender: TObject); 
var 
    i: integer; 
begin 
    ListView1.ViewStyle := vsReport; 
    ListView1.Columns.Add.Caption := 'Col 1'; 
    ListView1.Columns.Add.Caption := 'Col 2'; 
    ListView1.Columns.Add.Caption := 'Col 3'; 
    ListView1.GridLines := false; // You cannot have grid lines... 
    for i := 0 to 10 do 
    with ListView1.Items.Add do 
    begin 
     if i <> 5 then 
     begin 
     Caption := 'Test'; 
     SubItems.Add('test'); 
     SubItems.Add('test'); 
     end 
     else 
     Caption := 'This is a very, very long caption'; 
    end; 
end; 

var 
    ColWidths: array of integer; 

procedure TForm4.ListView1AdvancedCustomDraw(Sender: TCustomListView; 
    const ARect: TRect; Stage: TCustomDrawStage; var DefaultDraw: Boolean); 
var 
    i, j: Integer; 
begin 
    if Stage <> cdPrePaint then Exit; 
    if length(ColWidths) <> TListView(Sender).Columns.Count then 
    begin 
    SetLength(ColWidths, TListView(Sender).Columns.Count); 
    Exit; 
    end; 
    for i := 0 to length(ColWidths) - 1 do 
    if ColWidths[i] <> Sender.Column[i].Width then 
    begin 
     Sender.Invalidate; 
     for j := 0 to length(ColWidths) - 1 do 
     ColWidths[i] := Sender.Column[i].Width; 
    end; 
end; 

procedure TForm4.ListView1AdvancedCustomDrawItem(Sender: TCustomListView; 
    Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; 
    var DefaultDraw: Boolean); 
var 
    r: TRect; 
begin 
    DefaultDraw := (Item.SubItems.Count <> 0); 
    if not DefaultDraw then 
    begin 
    FillRect(Sender.Canvas.Handle, Item.DisplayRect(drBounds), GetStockObject(WHITE_BRUSH)); 
    r := Item.DisplayRect(drBounds); 
    DrawText(Sender.Canvas.Handle, Item.Caption, length(Item.Caption), r, DT_SINGLELINE or DT_LEFT or DT_VCENTER) 
    end; 
end; 

Listview colspan is hard to get right. Don't do it. http://privat.rejbrand.se/listviewcolspan.png

가 강력하지 않기 때문에 이것은 나쁜입니다. 깜박이고 버그가 있으며 "해킹"입니다. 향후 Windows 버전에서는 제대로 작동하지 않을 수 있습니다. 기본적으로 Windows 목록보기 컨트롤은 HTML을 사용하지 않아야한다고 생각합니다. colspan 같은 것 같습니다.

+0

하지만 그리드 라인이 필요합니다 : ( – Kermia

+0

@Kermia : 많은 것들을 시도했지만 Windows는이 모든 것을 컨트롤 위에 페인트하려고합니다. –

+0

감사합니다 Andreas :) – Kermia