You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi Tokyo运行时设置ListView项加粗失效问题求助

Delphi 10.2 Tokyo中ListView自定义绘制加粗失效的解决办法

我之前也碰到过这个一模一样的问题!在Delphi 10.2 Tokyo里,TListView的CustomDrawItem事件对字体加粗的处理确实和10.1 Berlin不一样了——颜色能正常生效,但加粗样式会被后续的默认绘制流程给覆盖掉,这是因为Tokyo调整了VCL控件的绘制逻辑,尤其是结合VCL Styles的时候,这种情况更明显。

给你两种靠谱的解决方式:

方式一:关闭默认绘制,手动绘制Item内容

这种方法最直接,完全掌控绘制过程,不会被默认逻辑干扰:

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  // 先关闭默认绘制,接下来我们自己画
  DefaultDraw := False;
  
  // 先继承ListView的默认字体设置,避免样式混乱
  Sender.Canvas.Font.Assign(Sender.Font);
  
  if Item.Caption = 'Item2' then
  begin
    Sender.Canvas.Font.Style := Sender.Canvas.Font.Style + [fsBold];
    Sender.Canvas.Font.Color := clRed;
  end
  else
  begin
    // 确保移除加粗样式
    Sender.Canvas.Font.Style := Sender.Canvas.Font.Style - [fsBold];
  end;
  
  // 绘制Item的标题文本,位置对应Item的坐标
  Sender.Canvas.TextOut(Item.Left, Item.Top, Item.Caption);
  
  // 如果你的ListView有子项,这里可以添加子项的绘制逻辑
  // 比如循环Item.SubItems,计算位置后调用TextOut
end;

方式二:改用AdvancedCustomDrawItem事件

如果你不想自己手动绘制全部内容,可以用AdvancedCustomDrawItem事件,它能在绘制的不同阶段介入,我们在预绘制阶段修改字体,这样默认绘制会使用我们修改后的样式:

procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
begin
  // 只在预绘制阶段修改字体,这个阶段的设置会被默认绘制采纳
  if Stage = cdPrePaint then
  begin
    if Item.Caption = 'Item2' then
    begin
      Sender.Canvas.Font.Style := Sender.Canvas.Font.Style + [fsBold];
      Sender.Canvas.Font.Color := clRed;
    end
    else
    begin
      Sender.Canvas.Font.Style := Sender.Canvas.Font.Style - [fsBold];
    end;
  end;
end;

两种方式都能解决你的问题,第一种更灵活,第二种更贴近原来的开发习惯,你可以根据自己的需求选。

内容的提问来源于stack exchange,提问作者Marty Loftus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:15:56