How can I omit the grid lines of empty cells as a list?

How to hide grid lines separating empty cells from adjacent cells in a TListView control? This would be like an HTML table attribute colspanor Excel merge cells command. I would like the cells with the text in them to maintain their normal borders.

Example

+3
source share
2 answers

You can use TVirtualStringTree . It has the toAutoSpanColumns option, which will automatically fill in empty columns.

+3
source

There seems to be no reliable solution to this problem.

However, a bad decision is

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.

, . , , "". Windows. , , Windows HTML colspan.

+1

Source: https://habr.com/ru/post/1795277/


All Articles