代码之家  ›  专栏  ›  技术社区  ›  Remus Rigo

在tlistview中添加两行标题?

  •  3
  • Remus Rigo  · 技术社区  · 15 年前

    在标签中,我可以添加这样的新行

    Label.Caption:='First line'+#13#10+'SecondLine';
    

    这可以在TListView中完成吗?

    listItem:=listView.Items.Add;
    listItem.Caption:='First line'+#13#10+'SecondLine';
    

    谢谢

    3 回复  |  直到 8 年前
        1
  •  1
  •   mghie    15 年前

    标准中可以有多行字符串 TListView 在里面 vsReport 样式,但Afaik不支持不同的行高。但是,如果所有行的行数都相同,>1您可以很容易地实现这一点。

    您需要将列表视图设置为 OwnerDraw 模式,首先让您可以实际绘制多行标题,然后让您有机会将行高增加到所需的值。这是通过处理 WM_MEASUREITEM 消息,仅为所有者绘制的列表视图发送。

    举个小例子来说明这一点:

    type
      TForm1 = class(TForm)
        ListView1: TListView;
        procedure FormCreate(Sender: TObject);
        procedure ListView1DrawItem(Sender: TCustomListView; Item: TListItem;
          Rect: TRect; State: TOwnerDrawState);
      private
        procedure WMMeasureItem(var AMsg: TWMMeasureItem); message WM_MEASUREITEM;
      end;
    
    { TForm1 }
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ListView1.ViewStyle := vsReport;
      ListView1.OwnerDraw := True;
      ListView1.OwnerData := True;
      ListView1.Items.Count := 1000;
      with ListView1.Columns.Add do begin
        Caption := 'Multiline string test';
        Width := 400;
      end;
      ListView1.OnDrawItem := ListView1DrawItem;
    end;
    
    procedure TForm1.ListView1DrawItem(Sender: TCustomListView;
      Item: TListItem; Rect: TRect; State: TOwnerDrawState);
    begin
      if odSelected in State then begin
        Sender.Canvas.Brush.Color := clHighlight;
        Sender.Canvas.Font.Color := clHighlightText;
      end;
      Sender.Canvas.FillRect(Rect);
      InflateRect(Rect, -2, -2);
      DrawText(Sender.Canvas.Handle,
        PChar(Format('Multiline string for'#13#10'Item %d', [Item.Index])),
        -1, Rect, DT_LEFT);
    end;
    
    procedure TForm1.WMMeasureItem(var AMsg: TWMMeasureItem);
    begin
      inherited;
      if AMsg.IDCtl = ListView1.Handle then
        AMsg.MeasureItemStruct^.itemHeight := 4 + 2 * ListView1.Canvas.TextHeight('Wg');
    end;
    
        2
  •  1
  •   Robert Jay Mistry    8 年前

    我知道这是一条旧线,我不能把它计算出来,而是调整一个 TListView 可以为添加图像列表 StateImages 然后通过展开 国家形象 属性窗口中的项。您不需要加载任何实际图像。

    很抱歉,我不能相信真正了解这一点的人——这是我之前访问过的一个论坛。

        3
  •  0
  •   J__    15 年前

    我似乎无法使用tlistview实现这一点。但是使用 TMS TAdvListView ,您可以在项目文本中使用HTML,以便将标题置于2行:

      with AdvListView1.Items.Add do
      begin                           
        Caption := '<FONT color="clBlue">Line 1<BR>Line 2</font>';
      end;