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

如何修改ShellCtrls.pas使ListView默认仅创建1列?

修改ShellCtrls.pas让ListView默认仅显示名称列

不要用事后删除列的方式,应该从列创建的源头控制,直接只添加名称列,具体步骤如下:

核心修改思路

TCustomSystemListView的列是通过EnumColumns方法调用Shell API枚举系统默认文件夹列后逐个创建的。我们只需要在枚举过程中,仅保留名称列(对应Shell列标识符PID_NAME,常量值为$00000000),跳过其他列的创建。

具体代码修改

找到TCustomSystmListView.EnumColumns方法中循环添加列的代码段,替换为以下逻辑:

var
  ColumnInfo: SHCOLUMNINFO;
  i: Integer;
  Column: TListColumn;
begin
  // 清空现有列(原方法已有此步骤)
  Columns.Clear;
  i := 0;
  // 枚举Shell列信息
  while SHGetColumnInfo(Folder, i, SHCIF_ALL, ColumnInfo) do
  begin
    // 仅保留名称列
    if ColumnInfo.scid.pid = PID_NAME then
    begin
      Column := Columns.Add;
      Column.Caption := ColumnInfo.szTitle;
      Column.Width := ColumnInfo.cxDefault;
      // 可根据需求设置其他列属性,比如Alignment等
    end;
    Inc(i);
  end;
  // 原方法的其他逻辑(如设置默认视图等)保留
end;

说明

  • 该修改适用于Delphi 7和Delphi 10.4,二者ShellCtrls.pas中EnumColumns的核心枚举逻辑一致,仅细节略有差异。
  • 相比你现在在finally段删除列的方式,这种从源头控制的方法不会出现列创建后再删除的闪烁问题,也更符合组件的设计逻辑。
  • 如果需要默认视图为大图标/列表模式而非详细信息,可以额外修改组件的ViewStyle属性默认值(比如在TCustomSystemListView的构造方法中设置ViewStyle := vsList或vsIcon)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:43:07